首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫按月重新安排到特定的工作日。

熊猫按月重新安排到特定的工作日。
EN

Stack Overflow用户
提问于 2018-09-25 09:52:16
回答 1查看 3.8K关注 0票数 4

我有一张潘达斯的资料,我想每隔一个月的第三个星期五再来一次。

代码语言:javascript
复制
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日):

代码语言:javascript
复制
# 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结合使用可以得到月底值并抵消索引,这也不是我想要的:

代码语言:javascript
复制
from pandas.tseries.offsets import WeekOfMonth
dates_df.resample("M", loffset=WeekOfMonth(week=2, weekday=4)).last()

是否有其他选择(最好使用重采样),而不必先重采样到每天的值,然后添加一个掩码(这需要很长的时间来完成我的数据)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 11:09:10

第二次尝试是朝着正确的方向,您只需要使用WeekOfMonth作为规则,而不是使用它作为偏移:

代码语言:javascript
复制
dates_df.resample(WeekOfMonth(week=2, weekday=4)).asfreq().dropna()

这种方法不会抵消指数的影响,它应该只返回每个月第三个星期五的数据。

处理第三个星期五失踪的案件:

与上述代码,如果你有一个失踪的第三个星期五,整个月将被排除在外。但取决于您如何处理丢失的数据,您可以bfillffillpad。您可以将上述内容修改如下:

代码语言:javascript
复制
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).bfill().asfreq(freq='D').dropna()

以上将bfill丢失的第三个星期五与下一个价值。

Update:让我们使用固定的数据集而不是np.random

代码语言:javascript
复制
# 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

现在,让我们手动选择数据,看看每个月的第三个星期五的数据是什么样子的:

代码语言:javascript
复制
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

如果您没有错过第三个星期五,并运行前面提供的代码:

代码语言:javascript
复制
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).asfreq().dropna()

将产生以下产出:

代码语言:javascript
复制
2018-05-18  3
2018-06-15  1
2018-07-20  3
2018-08-17  1

正如你所看到的,指数没有在这里移动,它返回了每个月的第三个星期五的确切值。

现在假设您错过了一些第三个星期五,这取决于您要如何做(使用以前的值:ffill或下一个值bfill):

  • pad / ffill:将最后有效的观察转发到下一个有效的
  • 回填/填充:使用下一个有效的观察来填补空白
代码语言:javascript
复制
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

如果假设整个索引都像您的示例一样被移动:

代码语言:javascript
复制
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‘(月末),然后你抵消(向前移动)指数在每个月的第三个星期五。

正如您在偏移之前所看到的,它是这样的:

代码语言:javascript
复制
dates_df.resample(rule='M').asfreq().dropna()

# Output

2018-05-31  1
2018-06-30  1
2018-07-31  2
2018-08-31  3
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52495310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档