Timedelta.total_seconds()输出异常?实为CSV导出问题
Pandas计算时间差后CSV输出结果异常的原因分析
你提到用Timedelta.total_seconds()计算出的时间差本身正确,但导出CSV后需要除以1000才符合预期,问题大概率出在CSV的序列化/反序列化环节,常见原因如下:
导出时的数值类型自动转换
当使用to_csv()导出DataFrame时,如果Abweichung列的数值以整数形式存储,Pandas可能默认用科学计数法或特定格式保存,后续读取时被误判为毫秒级数值;如果列中存在整数和浮点数混合的情况,导出后的格式也可能导致读取解析出错,让数值看起来放大了1000倍。读取CSV时的解析错误
你用其他工具(比如Excel、另一段Pandas代码)读取导出的CSV时,可能没有指定正确的解析规则:比如Excel自动把秒数识别成了毫秒,或者CSV中存在千位分隔符(Pandas导出时可能自动添加),导致读取时数值被错误解析。循环赋值引发的隐式类型转换
你通过循环给Abweichung列赋值时,如果该列初始类型不是float64,可能会发生隐式类型转换。比如初始列是int64,当计算结果包含小数时被强制转为整数,导出后读取时就会出现数值偏差。
优化方案
首先替换低效的循环代码,用Pandas向量化操作避免隐式类型问题:
# 初始化Abweichung列为浮点类型 df_ausfallmeldung["Abweichung"] = pd.Series(dtype='float64') # 用布尔索引批量赋值,替代逐行循环 mask = df_ausfallmeldung["Prognose"].isna() df_ausfallmeldung.loc[mask, "Abweichung"] = (df_ausfallmeldung["Soll"] - df_ausfallmeldung["Eingang"]).dt.total_seconds() df_ausfallmeldung.loc[~mask, "Abweichung"] = (df_ausfallmeldung["Prognose"] - df_ausfallmeldung["Eingang"]).dt.total_seconds()
然后导出CSV时指定参数,避免格式混乱:
# 禁用科学计数法,指定浮点数格式,确保小数点和分隔符正确 df_ausfallmeldung.to_csv('output.csv', index=False, float_format='%.6f', sep=',', decimal='.')
读取CSV时明确指定列类型,避免解析错误:
df_read = pd.read_csv('output.csv', dtype={'Abweichung': 'float64'})
内容的提问来源于stack exchange,提问作者Kinggpuu
相关产品推荐
相关产品推荐

