Python 应用'Pandas.Timedelta.total_seconds'时出现异常行为`

Python 应用'Pandas.Timedelta.total_seconds'时出现异常行为`,python,pandas,datetime,timedelta,Python,Pandas,Datetime,Timedelta,我有一个带有Timedelta类型列的熊猫数据帧。我使用groupby和一个单独的月份列来按月创建这些Timdelta的组,然后我尝试使用agg函数以及Timedelta列上的min、max、mean,该列触发了DataError:没有要聚合的数值类型 作为解决方案,我尝试使用total_seconds()函数和apply()来获得列的数字表示形式,然而,这种行为对我来说似乎很奇怪,因为我的Timedelta列中的NaT值被转换为-9.223372e+09,但是当total_seconds()

我有一个带有
Timedelta
类型列的熊猫数据帧。我使用groupby和一个单独的月份列来按月创建这些
Timdelta
的组,然后我尝试使用
agg
函数以及
Timedelta
列上的
min、max、mean
,该列触发了
DataError:没有要聚合的数值类型

作为解决方案,我尝试使用
total_seconds()
函数和
apply()
来获得列的数字表示形式,然而,这种行为对我来说似乎很奇怪,因为我的
Timedelta
列中的
NaT
值被转换为
-9.223372e+09
,但是当
total_seconds()

一个简单的例子:

test = pd.Series([np.datetime64('nat'),np.datetime64('nat')])
res = test.apply(pd.Timedelta.total_seconds)
print(res)
产生:

0   -9.223372e+09
1   -9.223372e+09
dtype: float64
鉴于:

res = test.iloc[0].total_seconds()
print(res)
收益率:

nan

第二个示例的行为是需要的,因为我希望执行聚合等并传播丢失/无效的值。这是一个错误吗?

您应该使用
.dt.total_seconds()
方法,而不是将
pd.Timedelta.total_seconds
函数应用到
datetime64[ns]
dtype列:

In [232]: test
Out[232]:
0   NaT
1   NaT
dtype: datetime64[ns]  # <----

In [233]: pd.to_timedelta(test)
Out[233]:
0   NaT
1   NaT
dtype: timedelta64[ns]  # <----

In [234]: pd.to_timedelta(test).dt.total_seconds()
Out[234]:
0   NaN
1   NaN
dtype: float64

好的,但是
pd.NaT
确实有一个
pd.NaT.total_seconds()
方法,它返回
NaN
,所以这是违反直觉的,我们希望它能工作。实际上还有其他方法吗?Atm我通过pd.to_timedelta().dt.total_seconds()将时间戳转换为数值,但经过一些计算后,我想将其重新转换。@Ben,这取决于您(数据集)的具体内容以及您想要得到的具体内容;)我的时间格式为“2018-02-05 13:00:00”,我将其转换为“1.517839e+09”。我可以重新转换吗?太棒了,。。这是显而易见的:)谢谢!
In [228]: s = pd.Series(pd.to_timedelta(['03:33:33','1 day','aaa'], errors='coerce'))

In [229]: s
Out[229]:
0   0 days 03:33:33
1   1 days 00:00:00
2               NaT
dtype: timedelta64[ns]

In [230]: s.dt.total_seconds()
Out[230]:
0    12813.0
1    86400.0
2        NaN
dtype: float64