Python 在熊猫中强制日期符合给定频率

Python 在熊猫中强制日期符合给定频率,python,pandas,Python,Pandas,假设我们有一个月时间序列,可能缺少月份,在将数据加载到带有DatetimeIndex的pandas series对象中时,我们希望确保每个日期观测都标记为月末日期。然而,原始输入日期可能会落在本月的任何地方,因此我们需要强制它们进行月末观察 我的第一个想法是这样做: import pandas as pd pd.DatetimeIndex([datetime(2012,1,20), datetime(2012,7,31)], freq='M') 但是,这只是将日期保留为[2012-01-202

假设我们有一个月时间序列,可能缺少月份,在将数据加载到带有DatetimeIndex的pandas series对象中时,我们希望确保每个日期观测都标记为月末日期。然而,原始输入日期可能会落在本月的任何地方,因此我们需要强制它们进行月末观察

我的第一个想法是这样做:

import pandas as pd
pd.DatetimeIndex([datetime(2012,1,20), datetime(2012,7,31)], freq='M')
但是,这只是将日期保留为[2012-01-202012-07-31],并不强制将其设置为月末值[2012-01-312012-07-31]

我的第二次尝试是:

ix = pd.DatetimeIndex([datetime(2012,1,20), datetime(2012,7,31)], freq='M')
s = pd.Series(np.random.randn(len(ix)), index=ix)
s.asfreq('M')
但这给了:

2012-01-31        NaN
2012-02-29        NaN
2012-03-31        NaN
2012-04-30        NaN
2012-05-31        NaN
2012-06-30        NaN
2012-07-31    0.79173
Freq: M
与发动机罩下一样,
asfreq
函数正在调用
date\u range
以获取日期时间索引


如果我使用
periodinex
而不是
DatetimeIndex
,这个问题很容易解决;但是,我需要支持一些当前不受
PeriodIndex
支持的频率,据我所知,没有办法用我自己的
Period
频率扩展pandas。

这是一种解决方法,但它不使用
PeriodIndex

from pandas.tseries.offsets import *

In [164]: s
Out[164]: 
2012-01-20   -1.266376
2012-07-31   -0.865573

In [165]: s.index=s.index+MonthEnd(n=0)

In [166]: s
Out[166]: 
2012-01-31   -1.266376
2012-07-31   -0.865573

这是一种变通方法,但它不使用
periodindex

from pandas.tseries.offsets import *

In [164]: s
Out[164]: 
2012-01-20   -1.266376
2012-07-31   -0.865573

In [165]: s.index=s.index+MonthEnd(n=0)

In [166]: s
Out[166]: 
2012-01-31   -1.266376
2012-07-31   -0.865573

至于你的最后一个例子,你想要什么样的输出?我只想要2012-01-31和2012-07-31的条目。但是,2012-01-31的值应该是2012-01-20提供的值,而不是NaN。至于您的最后一个示例,您想要的是什么输出?我只想要2012-01-31和2012-07-31的条目。但是2012-01-31的值应该是2012-01-20提供的值,而不是NaN。谢谢,这很有效。我以前也尝试过类似的方法,但没有想到对MonthEnd使用n=0参数,这在本例中是必不可少的。
s=s.resample('M',fill_method='ffill')
谢谢,这很有效。我以前也尝试过类似的方法,但没有想到对MonthEnd使用n=0参数,这在本例中是必不可少的。
s=s.resample('M',fill_method='ffill')