【问题标题】:Negative time difference in Pandas熊猫的负时差
【发布时间】:2021-08-10 17:38:57
【问题描述】:

我通过将较早的时间戳减去后面的时间戳得到这个奇怪的结果:

pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')

输出:

Timedelta('-1 days +23:58:00')

预期输出:

Timedelta('-0 days 00:02:00')

计算负时差的正确方法是什么?谢谢!

【问题讨论】:

  • 请用 pandas 版本更新您的问题
  • 你期待什么结果?
  • @Umar.H 我的意思是我希望 - 2 分钟,而不是 - 2 天。
  • 这给出了正确的输出......你的结果是Timedelta('-1 days +23:58:00')等于-24:00:00 + 23:58:00 => 2 mins
  • @MykolaZotko.. 我就是这么做的

标签: python pandas time-series timestamp timedelta


【解决方案1】:

Timedelta('-1 days +23:58:00') 在 pandas(以及在纯 python 中)负时差的正确表示

# using pure python
from datetime import datetime
datetime(2021,5,21,6,0,0) - datetime(2021,5,21,6,2,0)
datetime.timedelta(days=-1, seconds=86280)

这是因为差值被正确计算为-120 seconds,但单个时间元素不能超过它们的模数。 timedelta 分量被归一化。为了表示负 2 分钟,使用负日期和正时间分量。

from the python datetime module's documentation

然后对天、秒和微秒进行归一化,以便表示是唯一的,其中

  • 0
  • 0
  • -999999999

请注意,负值的标准化起初可能会令人惊讶。例如:

from datetime import timedelta
d = timedelta(microseconds=-1)
(d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)

可以使用 Timedelta.total_seconds 方法将总秒数检索为负整数

【讨论】:

    【解决方案2】:

    我们可以total_seconds

    (pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')).total_seconds()
    Out[9]: -120.0
    

    【讨论】:

    • 能否解释一下默认行为。
    • 我可以想象会发生这样的事情:timedelta 对象计算完整的一天,然后将小时数:分钟:秒添加到该值。这在技术上是正确的,但很难看。只是一个观察。
    【解决方案3】:

    使用abs 获取时间增量:

    >>> abs(pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00'))
    Timedelta('0 days 00:02:00')
    

    【讨论】:

    • 请注意,这是不正确的增量,OP 很好奇如何将增量表示为 0 days -00:02:00'
    【解决方案4】:

    你的代码给出了正确的输出...... 你的结果是Timedelta('-1 days +23:58:00') 等于-24:00:00 + 23:58:00 => 2 mins

    【讨论】:

      【解决方案5】:

      您可以使用np.timedelta64 将时间增量更改为您想要的输出

      正如其他人所说,pandas 否定 Timedelta 对象是 python 中的正确输出。

      import numpy as np
      delta = pd.to_datetime('2021-05-21 06:00:00') - pd.to_datetime('2021-05-21 06:02:00')
      
      
      print(delta)
      Timedelta('-1 days +23:58:00')
      
      #minutes
      print(delta / np.timedelta64(1,'m')
      -2.0
      #seconds
      delta / np.timedelta64(1,'s')
      -120.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2021-10-26
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多