向datetime64[ns]添加军事时间报错:'int'对象不可切片
解决Pandas中无法将年积日+军事时间转换为datetime的问题
我看到你遇到的问题了——用整数拼接的方式尝试生成带军事时间的datetime列时,抛出了TypeError: 'int' object is unsliceable的错误。这其实是因为**pd.to_datetime的format参数是针对字符串格式解析的,你传入的整数类型没办法被strptime相关函数做切片操作**,底层就报错了。
给你两种靠谱的解决方案,你可以根据自己的情况选:
方法1:将整数转为字符串后再解析
既然format是给字符串用的,那我们先把拼接后的整数转成符合格式要求的字符串,再交给pd.to_datetime处理。注意要保证年积日是3位(比如1→001)、军事时间是4位(比如5→0005),这样才能匹配%Y%j%H%M的格式:
# 利用你已经生成的test列,转成字符串后解析 tmp['date2'] = pd.to_datetime(tmp['test'].astype(str), format='%Y%j%H%M') # 或者直接拼接成符合格式的字符串(更稳妥,避免位数不足的问题) tmp['date_str'] = ( tmp['year'].astype(str) + tmp['day'].astype(str).str.zfill(3) # 年积日补零到3位 + tmp['military_time'].astype(str).str.zfill(4) # 军事时间补零到4位 ) tmp['date2'] = pd.to_datetime(tmp['date_str'], format='%Y%j%H%M')
方法2:基于已有date列添加时间差
如果你已经有了date列(datetime类型的日期),其实不用重新解析整个字符串,直接把军事时间转换成小时和分钟,用timedelta加到日期上就行,这种方法效率更高:
# 拆分军事时间为小时和分钟:比如1234→12小时34分,5→0小时5分 tmp['hours'] = tmp['military_time'] // 100 tmp['minutes'] = tmp['military_time'] % 100 # 把时间差加到已有date列上 tmp['date2'] = tmp['date'] + pd.to_timedelta(tmp['hours'], unit='h') + pd.to_timedelta(tmp['minutes'], unit='m')
为什么之前的代码会报错?
再给你解释下根源:当你传入整数给pd.to_datetime并指定format时,底层的解析函数会尝试像操作字符串一样对整数做切片(比如取前4位当年份),但整数是不可切片的对象,所以就抛出了那个TypeError。只要把整数转成字符串,或者用timedelta的方式绕开字符串解析,就能解决问题啦。
内容的提问来源于stack exchange,提问作者ohh
相关产品推荐
相关产品推荐

