【问题标题】:How to change observed holidays in holidays module?如何在假期模块中更改观察到的假期?
【发布时间】:2020-05-02 20:08:59
【问题描述】:

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

我的主要问题是我不确定如何在假期修改“观察到的”值。只有当它落在星期天时,我才需要在星期一观察一个假期。我不需要在星期六遵守星期五假期。

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

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

如果这太罗嗦了,我深表歉意,但我感谢您在此问题上提供的任何帮助。

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

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

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

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

假期类的代码(很长,但是 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()

【问题讨论】:

  • 您能否显示出现错误的代码以及完整的回溯?
  • 应该是holidays.SUNholidays.JUL
  • object is not callable 错误发生在您不应该将() 放在变量之后。

标签: python python-holidays


【解决方案1】:

我正在解决同样的问题(NERC 电力假期)并看到了您的问题。 Pierre Boutquin's answer 到一个相关问题让我找到了一个更快的解决方案:只需将 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)
    ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多