如何在假期模块中更改观察到的假期?



我是这个python假期库的新手,所以我提前为我可能提出的任何琐碎问题道歉。

我的主要问题是我不确定如何在假期中修改"观察到"的值。只有当假期是星期天时,我才需要在星期一庆祝假期。我不需要在周六遵守周五假期。

如果我想完全而不是部分删除"观察"假期,该文档似乎只有解决方案。我的解决方法是创建一个NewCountrysHolidays类,并用我想要的假期和观察到的状态填充它。我在下面附上了新类的代码。

我的新问题是我收到错误代码:'datetime.date' object is not callable当我执行1-1-2015 in us_electric_holidays时,但它确实适用于我的数据的时间戳。当我使用我的数据时,我收到一个新的错误name 'SUN' is not defined。它似乎不认识工作日(星期日(和月份(12月(。我不知道为什么。

如果这很冗长,我深表歉意,但我感谢并感谢您对此问题的任何帮助。

问题的背景:(如果有兴趣( 我是一名电气工程博士生,专攻电网。我的任务之一是分析电力公司的数据。电力公司将假期定义为:

假期是元旦、总统日、阵亡将士纪念日、独立日、劳动节、退伍军人节、感恩节和圣诞节。当任何假期落在星期日时,下一个星期一将被视为假期。但是,星期六的假期不会有任何变化。

为了正确标记所有数据,我需要删除马丁路德金日和哥伦布日。然后从星期五假期中删除观察星期六。

我在下面的代码中实现了所有这些,但它不会运行。

假期类的代码(它很长,但 StackOverflow 不允许我附加文件(:

import holidays
from datetime import date
from dateutil.relativedelta import relativedelta as rd

class UsElectricHolidays(holidays.HolidayBase):
def _populate(self, year):
# New Year's Day
if year > 1870:
name = "New Year's Day"
self[date(year, JAN, 1)] = name
if self.observed and date(year, JAN, 1).weekday() == SUN:
self[date(year, JAN, 1) + rd(days=+1)] = name + 
" (Observed)"
# Washington's Birthday
name = "Washington's Birthday"
if year > 1970:
self[date(year, FEB, 1) + rd(weekday=MO(+3))] = name
elif year >= 1879:
self[date(year, FEB, 22)] = name
# Memorial Day
if year > 1970:
self[date(year, MAY, 31) + rd(weekday=MO(-1))] = "Memorial Day"
elif year >= 1888:
self[date(year, MAY, 30)] = "Memorial Day"
# Independence Day
if year > 1870:
name = "Independence Day"
self[date(year, JUL, 4)] = name
if self.observed and date(year, JUL, 4).weekday() == SUN:
self[date(year, JUL, 4) + rd(days=+1)] = name + " (Observed)"
# Labor Day
if year >= 1894:
self[date(year, SEP, 1) + rd(weekday=MO)] = "Labor Day"
# Veterans Day
if year > 1953:
name = "Veterans Day"
else:
name = "Armistice Day"
if 1978 > year > 1970:
self[date(year, OCT, 1) + rd(weekday=MO(+4))] = name
elif year >= 1938:
self[date(year, NOV, 11)] = name
if self.observed 
and date(year, NOV, 11).weekday() == SUN:
self[date(year, NOV, 11) + rd(days=+1)] = name + 
" (Observed)"
# Thanksgiving
if year > 1870:
self[date(year, NOV, 1) + rd(weekday=TH(+4))] = "Thanksgiving"
# Christmas Day
if year > 1870:
name = "Christmas Day"
self[date(year, DEC, 25)] = "Christmas Day"
if self.observed 
and date(year, DEC, 25).weekday() == SUN:
self[date(year, DEC, 25) + rd(days=+1)] = name + 
" (Observed)"
us_electric_holidays = UsElectricHolidays()

我正在研究同样的问题(NERC电力假期(并看到了您的问题。皮埃尔·布特昆(Pierre Boutquin(对一个相关问题的回答使我找到了更快的解决方案:只需将nearest_workday替换为sunday_to_monday,您就可以拥有所需的东西。

这样:

class NERCHolidayCalendar(AbstractHolidayCalendar):
rules = [
Holiday('NewYearsDay', month=1, day=1, observance=sunday_to_monday),
USMemorialDay,
Holiday('USIndependenceDay', month=7, day=4, observance=sunday_to_monday),
USLaborDay,
USThanksgivingDay,
Holiday('Christmas', month=12, day=25, observance=sunday_to_monday)
]

最新更新