我需要回到月初,但如果我已经在开始时我想留在那里。 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)
一起使用
答案 0 :(得分:4)
要跳到月份开始,请使用:
<span>
是的,这很丑陋,但是如果ts + pd.tseries.offsets.MonthEnd(n=0) - pd.tseries.offsets.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')