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

时间:2015-05-27 14:50:26

标签: python pandas

尝试使用pandas.tseries.holidays类定义一组规则,但无法弄清楚如何根据其他规则创建规则。我有以下规则,但后来想要创建另一个规则,在一个工作日内抵消原始规则:

感恩:

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

黑色星期五:

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

同样尝试为网络星期一创建规则,这将是感恩节后的星期一。尝试以下但是返回11-2

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

但上面的回复无效

  

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

4 个答案:

答案 0 :(得分:3)

如今,在同一假日规则中无法定义偏移遵守参数。

我在England的拳击假日发现了这个问题。节礼日是圣诞节后的下一个工作日。

我使用指向适当规则的observance参数对解决方案进行编码,在这种情况下: after_nearest_workday

    Holiday('Christmas', month=12, day=25, observance=nearest_workday),
    Holiday('Boxing Day', month=12, day=25, observance=after_nearest_workday)

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

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))

答案 1 :(得分:1)

我不相信你可以指定假期相对于其他假期。但是,在您的情况下,我们可以定义符合您要求的假期。鉴于感恩节是第四个星期四,BlackFriday是第四个星期五,Cyber​​Monday是第四个星期六(在下周一观察)。感恩节的最晚日期是11月28日,所以星期六将是11月30日,“节日”将于12月2日开始。

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)

答案 2 :(得分:1)

对于遇到此事的任何人。在提交Pandas问题解决了我的问题后得到了这个帮助。 https://github.com/pydata/pandas/issues/10217#issuecomment-106040041

答案 3 :(得分:1)

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

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)])