我需要回到月初,但是如果我已经开始的话,我想呆在那里。应该使用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)
要跳至本月的开始,请使用:
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)
这确实是见证的正确行为,这是锚定偏移语义中为支持 特定频率偏移的开始/结束的偏移制定的规则的一部分。
考虑给定的例子:
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)
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |