熊猫Dateoffset行为不一致

时间:2020-05-30 11:46:58

标签: python pandas

我正在尝试向时间戳对象添加月份,但不了解以下行为:

import pandas as pd

t1 = pd.Timestamp('2020-05-29')+4*pd.DateOffset(months=3)
t2 = pd.Timestamp('2020-05-29')+2*pd.DateOffset(months=6)

我认为t1和t2应该相等(两种情况下均为12个月),但是t1是Timestamp('2021-05-28 00:00:00'),而t2是Timestamp('2021-05-29 00 :00:00')

这是一个错误吗?正确答案应该是t2

1 个答案:

答案 0 :(得分:1)

添加以月表示的DateOffsets是一个棘手的问题。 实际上是像pd.Timestamp('2020-05-29') + 4 * pd.DateOffset(months=3)这样的表达式 通过将此偏移量相加4次在后台执行。

运行这样的代码:

tt = pd.Timestamp('2020-05-29')
for i in range(4):
    tt += pd.DateOffset(months=3)
    print(f'{i}: {tt}')

您将获得:

0: 2020-08-29 00:00:00
1: 2020-11-29 00:00:00
2: 2021-02-28 00:00:00
3: 2021-05-28 00:00:00

请注意,当您向 2020-11-29 添加3个月时,结果为第28 2月的一天,因为 2021 的Feruary只有28天。

从该日期开始的下一个添加项将产生 2021-05-28 (天为 还有 28 )。

但是当您添加 6 个月的DateOffset时,情况就如您 执行:

tt = pd.Timestamp('2020-05-29')
for i in range(2):
    tt += pd.DateOffset(months=6)
    print(f'{i}: {tt}')

结果是:

0: 2020-11-29 00:00:00
1: 2021-05-29 00:00:00

正如预期的那样,因为2月底没有发生“停止”。