使用Pandas从开始时间与时长计算结束时间:报错问题咨询
解决Pandas计算结束时间时的TypeError和SettingWithCopyWarning问题
一、处理 TypeError: Cannot compare type 'Timestamp' with type 'int'
这个错误大概率是全量数据里存在非标准时间格式或非数值类型的时长数据,小数据量刚好避开了这些无效值,全量数据就触发了类型不匹配问题。可以按以下步骤修复:
- 显式转换
Start_time为datetime类型,处理无效值
不要依赖pd.DatetimeIndex临时转换,先把整列统一转成datetime类型,同时将无法识别的时间转为NaT(Not a Time),方便后续排查清理:
time_temp['Start_time'] = pd.to_datetime(time_temp['Start_time'], errors='coerce')
之后可以检查并处理无效数据:
# 查看包含无效时间的行 print(time_temp[time_temp['Start_time'].isna()]) # 根据业务需求删除无效行(可选) time_temp = time_temp.dropna(subset=['Start_time'])
- 确保
Duration列是数值类型
同样,把时长列转成数值类型,无法转换的内容转为NaN:
time_temp['Duration'] = pd.to_numeric(time_temp['Duration'], errors='coerce') # 清理无效时长的行(可选) time_temp = time_temp.dropna(subset=['Duration'])
- 重新计算结束时间
现在列类型都标准化了,直接用datetime列加时间差即可:
time_temp['End_time'] = time_temp['Start_time'] + pd.to_timedelta(time_temp['Duration'], unit='m')
二、解决SettingWithCopyWarning
这个警告提示你正在修改一个DataFrame切片的副本,而非原始DataFrame,可能导致修改不生效或出现意外行为。有两种常用解决方式:
- 显式创建副本
在对time_temp做任何修改前,先复制一份独立的DataFrame:
# 假设time_temp是从其他DataFrame切片得到的,先执行复制 time_temp = time_temp.copy() # 之后再执行转换、计算等操作
- 用
.loc避免链式索引
如果time_temp是通过链式索引生成的(比如time_temp = df[df['col'] > 0]['Start_time']),改成用.loc语法获取切片,确保操作的是可控的视图或副本:
# 替换链式索引为.loc写法 time_temp = df.loc[df['col'] > 0, :].copy()
完成以上操作后,警告会消失,同时能保证你的修改正确应用到DataFrame上。
内容的提问来源于stack exchange,提问作者Jahnab Kumar Deka
相关产品推荐
相关产品推荐

