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

Pandas将timedelta64[ns]转为object导致求和报错,如何给时间差设1分钟上限?

问题原因

你在给TIME_DIFFERENCE列赋值时直接使用了字符串格式的'00:01:00',导致原本为timedelta64[ns]类型的列混入了字符串元素,pandas会自动将整列的数据类型降级为通用的object类型,后续求和时就会出现类型不匹配的报错。你之前用过滤逻辑仅做判断、没有修改列的值,因此不会触发类型转换问题,运行正常。

解决方法

方法1:修改赋值逻辑,使用Timedelta类型赋值

将原本赋值字符串的逻辑改为直接赋值pd.Timedelta类型,保证列的数据类型不变:

temp['ACCESS_TIME'] = pd.to_datetime(temp['ACCESS_TIME'])
temp = temp.sort_values(['ID','ACCESS_TIME'])

temp['TIME_DIFFERENCE'] =  temp.groupby(['ID'])['ACCESS_TIME'].diff()

oneMin = temp.copy()

# 改用Timedelta类型赋值,不要使用字符串
oneMin.loc[(oneMin.TIME_DIFFERENCE > pd.Timedelta(minutes=1)), 'TIME_DIFFERENCE'] = pd.Timedelta(minutes=1)
oneMin['DURATION'] = oneMin.groupby(['ID'])['TIME_DIFFERENCE'].transform('sum')

方法2:使用clip方法直接截断(更简洁高效)

pandas的clip方法原生支持timedelta类型,可以直接指定上下限做截断,无需手动写判断赋值逻辑:

temp['ACCESS_TIME'] = pd.to_datetime(temp['ACCESS_TIME'])
temp = temp.sort_values(['ID','ACCESS_TIME'])

temp['TIME_DIFFERENCE'] =  temp.groupby(['ID'])['ACCESS_TIME'].diff()

oneMin = temp.copy()
# upper设为1分钟,lower设为None表示不限制下限
oneMin['TIME_DIFFERENCE'] = oneMin['TIME_DIFFERENCE'].clip(upper=pd.Timedelta(minutes=1))
oneMin['DURATION'] = oneMin.groupby(['ID'])['TIME_DIFFERENCE'].transform('sum')

内容的提问来源于stack exchange,提问作者user2977533

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 11:15:05