首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫时间序列假日规则抵消

熊猫时间序列假日规则抵消
EN

Stack Overflow用户
提问于 2015-05-27 14:50:25
回答 4查看 2.8K关注 0票数 6

试图使用pandas.tseries.holidays类定义一组规则,但无法弄清楚如何仅基于另一条规则创建规则。我有下面的规则,但是想要创建另一个规则,它可以在一个工作日内抵消原来的规则:

感恩节:

Holiday("Thanksgiving Day", month=11, day=1, offset=pd.DateOffset(weekday=TH(4))),

黑色星期五:

代码语言:javascript
运行
复制
Holiday("Thanksgiving Day", month=11, day=1, 
        offset=pd.DateOffset(weekday=TH(4))) + pd.DateOffset(1),

同样,试图为网络星期一创造规则,也就是感恩节之后的星期一。尝试了下面的内容,但是这个返回11-2。

代码语言:javascript
运行
复制
Holiday("Thanksgiving Day", month=11, day=1,
        offset=pd.DateOffset(weekday=TH(4)), observance=next_monday)

但是上面的话不会回来的

TypeError:添加操作不受支持的类型

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-25 23:58:13

使用最新的pandas 0.23.4,现在很容易做到这一点。

代码语言:javascript
运行
复制
import pandas as pd
from pandas.tseries.offsets import Day
from dateutil.relativedelta import TH

BlackFriday = Holiday("Black Friday", month=11, day=1, 
        offset=[pd.DateOffset(weekday=TH(4)), Day(1)])
票数 2
EN

Stack Overflow用户

发布于 2015-05-27 15:36:17

我不相信你能指定其他假期的节假日。但是,在您的情况下,我们可以定义符合您要求的假期。既然感恩节是第四个星期四,那么BlackFriday是第四个星期五,CyberMonday是第四个星期六(下个星期一)。感恩节的最新日期是11月28日,所以星期六是11月30日,“假日”将在12月2日举行。

代码语言:javascript
运行
复制
from pandas.tseries.holiday import Holiday, TH, FR, SA, next_monday

Holiday("Black Friday", month=11, day=1, offset=pd.DateOffset(weekday=FR(4)))
Holiday("CyberMonday", month=11, day=1, offset=pd.DateOffset(weekday=SA(4)), 
        observance=next_monday)
票数 3
EN

Stack Overflow用户

发布于 2016-04-25 11:15:31

现在,在相同的假日规则中不可能同时定义偏移参数和遵守参数。

我在英国的节礼日发现了这个问题。节礼日是圣诞节之后的下一个工作日。

我使用指向适当规则的遵守参数编写了解决方案,在本例中是: after_nearest_workday

代码语言:javascript
运行
复制
    Holiday('Christmas', month=12, day=25, observance=nearest_workday),
    Holiday('Boxing Day', month=12, day=25, observance=after_nearest_workday)

after_nearest_workday是一个函数。如果需要另一个遵守规则,您可以创建自己的函数,如以下原始Pandas遵守函数:

代码语言:javascript
运行
复制
def nearest_workday(dt):
    """
    If holiday falls on Saturday, use day before (Friday) instead;
    if holiday falls on Sunday, use day thereafter (Monday) instead.
    """
    if dt.weekday() == 5:
        return dt - timedelta(1)
    elif dt.weekday() == 6:
        return dt + timedelta(1)
    return dt

def after_nearest_workday(dt):
    """
    returns next workday after nearest workday
    needed for Boxing day or multiple holidays in a series
    """
    return next_workday(nearest_workday(dt))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30485984

复制
相关文章

相似问题

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