尝试使用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:不支持的添加操作类型
答案 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是第四个星期五,CyberMonday是第四个星期六(在下周一观察)。感恩节的最晚日期是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)])