You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:52:32