我有一张潘达斯的资料,我想每隔一个月的第三个星期五再来一次。
np.random.seed(0)
#requested output:
dates = pd.date_range("2018-01-01", "2018-08-31")
dates_df = pd.DataFrame(data=np.random.random(len(dates)), index=dates)
mask = (dates.weekday == 4) & (14 < dates.day) & (dates.day < 22)
dates_df.loc[mask]

但是当第三个星期五没有了(例如,2月3日星期五下降),我想得到最新的值( 2018-02-15)。使用掩码将给出下一个值(2月17日而不是2月15日):
# remove February third Friday:
dates_df = dates_df.drop([pd.to_datetime("2018-02-16")])
mask = (dates.weekday == 4) & (14 < dates.day) & (dates.day < 22)
dates_df.loc[mask]

将每月重采样与loffset结合使用可以得到月底值并抵消索引,这也不是我想要的:
from pandas.tseries.offsets import WeekOfMonth
dates_df.resample("M", loffset=WeekOfMonth(week=2, weekday=4)).last()

是否有其他选择(最好使用重采样),而不必先重采样到每天的值,然后添加一个掩码(这需要很长的时间来完成我的数据)
发布于 2018-10-04 11:09:10
第二次尝试是朝着正确的方向,您只需要使用WeekOfMonth作为规则,而不是使用它作为偏移:
dates_df.resample(WeekOfMonth(week=2, weekday=4)).asfreq().dropna()这种方法不会抵消指数的影响,它应该只返回每个月第三个星期五的数据。
处理第三个星期五失踪的案件:
与上述代码,如果你有一个失踪的第三个星期五,整个月将被排除在外。但取决于您如何处理丢失的数据,您可以bfill、ffill、pad。您可以将上述内容修改如下:
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).bfill().asfreq(freq='D').dropna()以上将bfill丢失的第三个星期五与下一个价值。
Update:让我们使用固定的数据集而不是
np.random:
# create a smaller daterange
dates = pd.date_range("2018-05-01", "2018-08-31")
# create a data with only 1,2,3 values
data = [1,2,3] * int(len(dates)/3)
dates_df = pd.DataFrame(data=data, index=dates)
dates_df.head()
# Output:
2018-05-01 1
2018-05-02 2
2018-05-03 3
2018-05-04 1
2018-05-05 2现在,让我们手动选择数据,看看每个月的第三个星期五的数据是什么样子的:
dates_df.loc[[
pd.Timestamp('2018-05-18'),
pd.Timestamp('2018-06-15'),
pd.Timestamp('2018-07-20'),
pd.Timestamp('2018-08-17')
]]
Output:
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 1如果您没有错过第三个星期五,并运行前面提供的代码:
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).asfreq().dropna()将产生以下产出:
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 1正如你所看到的,指数没有在这里移动,它返回了每个月的第三个星期五的确切值。
现在假设您错过了一些第三个星期五,这取决于您要如何做(使用以前的值:ffill或下一个值bfill):
dates_df.drop(index=pd.Timestamp('2018-08-17')).resample(rule=WeekOfMonth(week=2, weekday=4)).ffill().asfreq(freq='D').dropna()
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 3
dates_df.drop(index=pd.Timestamp('2018-08-17')).resample(rule=WeekOfMonth(week=2, weekday=4)).bfill().asfreq(freq='D').dropna()
2018-04-20 1
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 2如果假设整个索引都像您的示例一样被移动:
dates_df.resample(rule='M', loffset=WeekOfMonth(week=2, weekday=4)).asfreq().dropna()
# Output:
2018-06-15 1
2018-07-20 1
2018-08-17 2
2018-09-21 3发生了什么事,你是重新按规则'M‘(月末),然后你抵消(向前移动)指数在每个月的第三个星期五。
正如您在偏移之前所看到的,它是这样的:
dates_df.resample(rule='M').asfreq().dropna()
# Output
2018-05-31 1
2018-06-30 1
2018-07-31 2
2018-08-31 3https://stackoverflow.com/questions/52495310
复制相似问题