首页 > 解决方案 > Python & Numpy - 如何删除每个数字/元素的最后 2 位数字?

问题描述

我有问题:

我使用 numpy 数组,但我有点卡住了。所以我有一个这样的年月数组:

array([['202305'],
       ['202109'],
       ['202110'],
       ['202002'],
       ['202001'],
       ['202003']], dtype='<U6')

所以,'202305' 表示:2023 年,5 月。问题是我只需要年份,所以我想删除最后 2 位数字,以便得到这样的数组:

array([['2023'],
       ['2021'],
       ['2021'],
       ['2020'],
       ['2020'],
       ['2020']], dtype='<U4')

我尝试了多种类似的方法:

for jaar in hr_jaar:
    jaar = int(str(jaar)[0:4])

这给出了我在大多数情况下得到的错误,但并不真正知道这意味着什么: ValueError: invalid literal for int() with base 10: "['20"

它应该很简单,但我不知何故被卡住了:)真的很感激!

标签: pythonnumpy

解决方案


更详细地了解迭代正在做什么:

In [118]: for jaar in hr_jaar: 
     ...:     print(jaar, str(jaar)[0:4]) 
     ...:                                                                                
['202305'] ['20
['202109'] ['20
['202110'] ['20
['202002'] ['20
['202001'] ['20
['202003'] ['20

hr_jaar是 (6,1) 数组,所以jaar是 (1,) 数组。 str(...)将该数组转换为字符串,包括“['”。

In [119]: for jaar in hr_jaar: 
     ...:     print(jaar[0], jaar[0][0:4]) 
     ...:                                                                                
202305 2023
202109 2021
202110 2021
202002 2020
202001 2020
202003 2020

jaar[0]将该字符串从数组中取出,然后可以对其进行切片。

但:

In [120]: for jaar in hr_jaar: 
     ...:     jaar = jaar[0][0:4] 

不改变hr_jaar。这是基本的 Python 迭代行为。

您必须在新列表中收集更改的字符串,就像使用此列表理解所做的那样:

In [122]: [jaar[0][0:4] for jaar in hr_jaar]                                             
Out[122]: ['2023', '2021', '2021', '2020', '2020', '2020']

使用astype更简单,但我认为您需要了解您的代码有什么问题。


推荐阅读