应用`Pandas.Timedelta.total_seconds`

时间:2018-01-09 12:25:52

标签: python pandas datetime timedelta

我有一个pandas数据框,其列为Timedelta类型。我使用groupby和一个单独的月份列按月创建这些Timdelta的组,然后我尝试在agg列上使用min, max, mean函数和Timedelta DataError: No numeric types to aggregate

作为解决方案,我尝试使用total_seconds()函数和apply()来获取列的数字表示,但是我的行为对于NaT值来说似乎很奇怪我的Timedelta列中的-9.223372e+09已变为NaN,但如果total_seconds()在没有apply()

的标量上使用,则会产生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

的产率:

<a>

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

1 个答案:

答案 0 :(得分:5)

您应该使用.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

另一个演示:

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