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
相关产品推荐
相关产品推荐

