Python & Numpy:如何移除数组元素最后两位以提取年份?
解决Numpy二维字符串数组提取年份的问题
我来帮你搞定这个问题!先拆解下你出错的原因:你的数组是二维字符串数组(每个元素都是一个单元素子数组,比如['202305']),当你执行str(jaar)时,其实是把整个子数组转成了字符串——比如str(['202305'])会得到"['202305']",取前四位就变成了"['20",这显然不是合法的整数格式,所以触发了ValueError。
下面给你几种高效的解决方案,从numpy原生的向量化操作到修正后的循环方法都有:
方法1:用Numpy字符串工具(推荐,高效简洁)
numpy提供了专门处理字符串数组的向量化函数,直接对每个元素做切片,完全不需要循环:
import numpy as np # 你的原始数组 hr_jaar = np.array([['202305'], ['202109'], ['202110'], ['202002'], ['202001'], ['202003']], dtype='<U6') # 提取每个字符串的前4位(年份) year_array = np.char.slice(hr_jaar, start=0, stop=4) # 输出结果:array([['2023'], ['2021'], ['2021'], ['2020'], ['2020'], ['2020']], dtype='<U4') print(year_array) # 如果需要转成整数类型的数组,直接用astype year_array_int = year_array.astype(int)
这个方法利用numpy的向量化特性,比手动循环快得多,尤其适合处理大规模数组。
方法2:修正你的循环逻辑
如果你坚持要用循环,需要正确访问子数组里的字符串元素,而不是直接把子数组转成字符串:
import numpy as np hr_jaar = np.array([['202305'], ['202109'], ['202110'], ['202002'], ['202001'], ['202003']], dtype='<U6') year_list = [] for jaar in hr_jaar: # 先取出子数组里的字符串元素(jaar是单元素数组,jaar[0]拿到'202305') year_str = jaar[0][:4] year_list.append([year_str]) # 转成目标numpy数组 year_array = np.array(year_list, dtype='<U4')
方法3:数学运算提取年份(适合数值化处理)
如果你的年月字符串可以安全转成整数,还可以用除法取整的方式提取年份:
import numpy as np hr_jaar = np.array([['202305'], ['202109'], ['202110'], ['202002'], ['202001'], ['202003']], dtype='<U6') # 先转成整数数组 int_array = hr_jaar.astype(int) # 除以100取整得到年份 year_array_int = int_array // 100 # 若需要转回字符串格式 year_array_str = year_array_int.astype('<U4')
内容的提问来源于stack exchange,提问作者Lotw
相关产品推荐
相关产品推荐

