(-)MonthBegin的熊猫日期时间锚定偏移量未按预期工作

Lam*_*aha 4 pandas

我需要回到月初,但是如果我已经开始的话,我想呆在那里。应该使用n = 0的Pandas锚定偏移量做到这一点,但它不会在(-)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)

Chr*_*ger 7

要跳至本月的开始,请使用:

ts + pd.tseries.offsets.MonthEnd(n=0) - pd.tseries.offse??ts.MonthBegin(n=1)
Run Code Online (Sandbox Code Playgroud)

是的,这很丑陋,但这是跳到本月初的唯一方法,而如果已经是第一个月,则停留ts该位置。

快速演示:

>>> pd.date_range(dt.datetime(2016,12,30), dt.datetime(2017,2,2)).to_series() \
        + MonthEnd(n=0) - MonthBegin(n=1)

2016-12-30   2016-12-01
2016-12-31   2016-12-01
2017-01-01   2017-01-01
2017-01-02   2017-01-01
...
2017-01-31   2017-01-01
2017-02-01   2017-02-01
2017-02-02   2017-02-01
Run Code Online (Sandbox Code Playgroud)

  • 或者,本着同样的精神,几乎同样难看,但只有一个偏移量:`+ MonthBegin(1)-MonthBegin(1)` (2认同)

Nic*_*eli 5

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

考虑给定的例子:

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')
Run Code Online (Sandbox Code Playgroud)

注意MonthBeginoffset对应的锚点设置为每个月的第一个。现在,由于给定的时间戳明显超过这一天,这些将自动被视为下个月的一部分,并且滚动(无论是向前还是向后)只会在此之后发挥作用。

摘自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')
Run Code Online (Sandbox Code Playgroud)

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

pd.Timestamp('2017-01-01 00:00:00') - MonthBegin(n=0)
Out[21]:
Timestamp('2017-01-01 00:00:00')
Run Code Online (Sandbox Code Playgroud)