减去大熊猫时间戳; 绝对值

lun*_*999 11 python pandas

我一直在尝试了解熊猫的时间戳和时间点.我喜欢你如何使用它们,但在尝试减法时我发现这有点奇怪:

now = pd.Timestamp('now')
then = now - pd.to_timedelta('1h')

print (now - then)
print (then - now)
print ((now - then).seconds)
print ((then - now).seconds)
Run Code Online (Sandbox Code Playgroud)

结果是:

0 days 01:00:00
-1 days +23:00:00
3600
82800
Run Code Online (Sandbox Code Playgroud)

a)我应该如何理解这种行为?

b)有没有办法获得时间戳差异的绝对值,相当于abs()?

jor*_*ris 13

这种看似奇怪/错误的行为的原因是.secondsa 的属性timedelta(for pandas.Timedelta,但这是从标准库中继承的timedelta.timedelta)是非常不明确的.
timedelta存储在3个部分中:天,秒,微秒(https://docs.python.org/2/library/datetime.html#timedelta-objects).所以它seconds是小时,分钟和秒的总和(以秒为单位).

所以有2个'奇怪'的东西会导致混乱:

  • 当有一个负时间delta,你得到-1 days +23:00:00而不是-01:00:00.这是因为只有days部分可以是负数.因此,负时间delta将始终定义为负天数,再次添加小时或秒以获得正确的值.所以这给了你一个+23h部分.
  • 秒是小时,分钟和秒的总和.所以+23:00:00我们得到的等于82800秒.

底线是,.secondstimedelta 的属性不会给你秒数部分既不是总秒数(timedelta转换为秒数).所以在实践中,我认为你几乎不应该使用它.

要以秒为单位获取timedelta,您可以使用该total_seconds方法.如果我将负面差异定义为diff = then - now:

In [12]: diff
Out[12]: Timedelta('-1 days +23:00:00')

In [13]: diff.seconds
Out[13]: 82800

In [14]: diff.total_seconds()
Out[14]: -3600.0
Run Code Online (Sandbox Code Playgroud)