【问题标题】:How to sum dtype: timedelta64[ns] in pandas/Python?如何在 pandas/Python 中求和 dtype: timedelta64[ns]?
【发布时间】:2019-01-02 18:02:44
【问题描述】:

我在 python 中使用 pands 来处理时间。 我想总结一下两个日期之间经过的时间,它们是:

0   2012-03-06 14:22:00
0   2012-06-02 11:29:00


1   2012-04-16 20:51:00
1   2012-04-28 09:57:00

为此,我计算前 2 个以 0 为索引的日期之间经过的时间,如下所示:

dt0 = df.end[0] - df.start[0]  
out: 87 days 21:07:00
dtype: timedelta64[ns]

在接下来的两个日期之间也一样:

dt1 = df.end[1] - df.start[1]  
out: 11 days 13:06:00
dtype: timedelta64[ns]

效果很好,但是当我将两次相加时:

dt2 = dt1 + dt0 

我得到 dt2 = NaT 而不是 87 天 21:07:00 + 11 天 13:06:00 的总和。任何人都可以帮忙吗?

下面是同样问题的另一个例子的截图:a和b相加,两个dtype:timedelta64[ns]不起作用,为什么?

【问题讨论】:

  • 抱歉,打错字了。是的!
  • 我得到Timedelta('99 days 10:13:00')?您可以在计算之前检查dt1dt0 以确保您没有覆盖它们吗?
  • 我确信 dt1 和 dt0 :/
  • 我得到 dt2 = NaT
  • 你能在求和之前尝试将dt1dt0 明确重铸为np.timedelta64() 吗?应该可以添加那些 numpy 对象...如果您收到 dt2 = np.timedelta64(dt0) + np.timedelta64(dt1) 错误,那么您应该尝试更新 numpy。

标签: python pandas datetime time


【解决方案1】:

看,这就是我明确希望你打印类型的原因。 dt1dt0 不是 <class 'pandas._libs.tslibs.timedeltas.Timedelta'>,它们是 pandas.Series

当您添加两个 Series 时,它会根据索引对齐。由于dt1dt2 不共享相同的索引,它用空值(在这种情况下为NaT)填充缺失值,然后执行加法。默认情况下,它不会在执行加法时忽略空值,因此您看到的是 x + NaT = NaT,这就是数学运算的方式。

样本数据

import pandas as pd

a = pd.Series(pd.Timedelta(1,'d'), index=[21005])
#21005   1 days
#dtype: timedelta64[ns]

b = pd.Series(pd.Timedelta(2,'d'), index=[16992])
#16992   2 days
#dtype: timedelta64[ns]

代码

加法将在索引上对齐。它们不共享索引,因此您会得到NaT

a+b
#16992   NaT
#21005   NaT
#dtype: timedelta64[ns]

您真正想要做的是添加值,而不考虑索引:

a.values+b.values
#array([259200000000000], dtype='timedelta64[ns]')

但实际上,如果您实际上不需要 pd.Series,您应该更改您的代码,以便 dt0dt1 只是值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2014-12-14
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多