应用`Pandas.Timedelta.total_seconds`时的奇怪行为

Posted

技术标签:

【中文标题】应用`Pandas.Timedelta.total_seconds`时的奇怪行为【英文标题】:Odd behaviour when applying `Pandas.Timedelta.total_seconds` 【发布时间】:2018-06-18 11:44:34 【问题描述】:

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

作为解决方案,我尝试使用total_seconds() 函数和apply() 来获得列的数字表示,但是我的行为似乎很奇怪,因为NaT 值在我的Timedelta 列中被转换为-9.223372e+09,但当total_seconds() 用于没有apply() 的标量时,它们会导致NaN

一个最小的例子:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

好的,但是 pd.NaT 确实有一个 pd.NaT.total_seconds() 方法,它确实返回 NaN,所以它违反直觉,我们希望它能够工作。 实际上是否还有其他可能的方法? Atm 我通过 pd.to_timedelta().dt.total_seconds() 将时间戳转换为数值,但经过一些计算后,我想重新转换它。 @Ben,这取决于你到底有什么(你的数据集)以及你想要得到什么;) 我在“2018-02-05 13:00:00”中有一个时间格式,我将其转换为“1.517839e+09”。我可以重新转换吗? 太棒了,.. 这很明显 :) 谢谢!

以上是关于应用`Pandas.Timedelta.total_seconds`时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

苹果应用商店的应用商店视图和应用单元是啥意思?

Windows 应用商店应用标准样式与 Windows 应用商店应用字体指南

向应用添加应用内购买会影响已购买该应用的用户吗?

应用商店拒绝应用后如何再次上传应用

通过应用内购买付费应用到免费应用

删除应用扩展后仍然出现应用安装失败错误 - 此应用包含具有非法捆绑标识符的应用扩展