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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:53