0

我有问题:

我使用 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"

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

4

3 回答 3

3

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

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更简单,但我认为您需要了解您的代码有什么问题。

于 2020-05-19T15:18:54.740 回答
1

您可以将元素转换为其他 dtype:

hr_jaar.astype('<U4')

您会得到观察到的错误,因为您的数据是二维的,因此jaar是一元数组,例如['202305']. 如果将其转换为str包含括号的值,即"['202305']".

于 2020-05-19T15:04:45.080 回答
0

另一个好方法是让 for 循环遍历数组并在循环中使用以下内容。循环看起来像:

for i in range(The_Array.size()): 


    Original_String=The_Array[i]

    New_String=Original_String[:-2]
于 2020-05-19T15:12:54.483 回答