Pandas中Timedelta.total_seconds结合apply的异常行为问询
解决Pandas中Timedelta列NaT转total_seconds时的异常值问题
首先给你两个快速可行的解决方法,帮你得到想要的NaN结果,顺利完成聚合操作:
方法1:使用Series的dt访问器(推荐)
直接用dt.total_seconds()代替apply,它会自动把NaT转换成NaN,完全符合你的需求:
import pandas as pd import numpy as np test = pd.Series([np.datetime64('nat'), np.datetime64('nat')]) res = test.dt.total_seconds() print(res)
输出结果:
0 NaN 1 NaN dtype: float64
处理后再进行groupby聚合时,min、max、mean都会正确传播NaN,不会再触发DataError。
方法2:手动在apply中处理NaT
如果因为某些场景必须使用apply,可以在自定义函数里判断元素是否为NaT,手动返回NaN:
res = test.apply(lambda x: x.total_seconds() if pd.notna(x) else np.nan) print(res)
这个方法也能得到和标量调用一致的NaN结果。
为什么会出现这个差异?
这算不上严格意义上的"bug",而是apply调用未绑定方法时的行为差异:
- 直接调用标量NaT的
total_seconds()时,这是实例方法调用,Pandas会正确识别NaT为缺失值,返回NaN。 - 但用
apply(pd.Timedelta.total_seconds)时,你传递的是pd.Timedelta类的未绑定方法,Pandas内部处理NaT时,会把它转换成底层的int64最小值(也就是-9.223372e+09),再调用方法,所以得到了异常数值。
关于是否是bug?
这个行为更像是设计上的不一致,Pandas社区可能已经注意到了该问题。建议你检查当前的Pandas版本,若使用的是较旧版本,可尝试升级到最新稳定版,看看该问题是否已被修复。
内容的提问来源于stack exchange,提问作者seanysull
相关产品推荐
相关产品推荐

