( - )MonthBegin的Pandas datetime锚定偏移量没有按预期工作

时间:2017-02-02 17:38:23

标签: pandas

我需要回到月初,但如果我已经在开始时我想留在那里。 Pandas锚定偏移量n = 0应该完全相同,但它不会产生( - )MonthBegin的锚定点之间的预期结果。

例如为此 pd.Timestamp('2017-01-06 00:00:00') - pd.tseries.offsets.MonthBegin(n=0) 我期待着让我回到Timestamp('2017-01-01 00:00:00') 但我获得Timestamp('2017-02-01 00:00:00') 我究竟做错了什么?或者你认为这是一个错误?

我还可以看到相同的规则适用于MonthEnd,因此将2合并为pd.Timestamp('2017-01-06 00:00:00')+pd.tseries.offsets.MonthEnd(n=0)-pd.tseries.offsets.MonthBegin(n=1) 我得到了Timestamp('2017-01-01 00:00:00')的预期效果,但我希望它能与- pd.tseries.offsets.MonthBegin(n=0)一起使用

2 个答案:

答案 0 :(得分:4)

要跳到月份开始,请使用:

<span>

是的,这很丑陋,但是如果ts + pd.tseries.offsets.MonthEnd(n=0) - pd.tseries.offse‌​ts.MonthBegin(n=1) 已经是第一个, ,这是跳到本月第一天的唯一方法。

快速演示:

ts

答案 1 :(得分:3)

这确实是目击的正确行为,它是锚定偏移语义中规定的规则的一部分,用于支持特定频率偏移的开始/结束的偏移。

考虑给出的例子:

from pandas.tseries.offsets import MonthBegin

pd.Timestamp('2017-01-02 00:00:00') - MonthBegin(n=0)
Out[18]:
Timestamp('2017-02-01 00:00:00')

请注意,与MonthBegin偏移对应的锚点设置为每月的第一个。现在,既然给定的时间戳明显超过了这一天,那么这些时间戳将自动被视为下个月的一部分而且滚动(无论是向前还是向后)只会在此之后发挥作用。

  

摘自docs
  对于n = 0的情况,如果在锚点上,则不移动日期,   否则它会前滚到下一个锚点。

要了解您的目标,您需要提供n=1,这会将时间戳滚动到正确的日期。

pd.Timestamp('2017-01-02 00:00:00') - MonthBegin(n=1)
Out[20]:
Timestamp('2017-01-01 00:00:00')

如果您已在确切的锚点上设置日期,那么它也会根据附加的文档为您提供所需的结果。

pd.Timestamp('2017-01-01 00:00:00') - MonthBegin(n=0)
Out[21]:
Timestamp('2017-01-01 00:00:00')