Как изменить наблюдаемые праздники в модуле праздников? - PullRequest
0 голосов
/ 16 января 2020

Я новичок в этой python праздничной библиотеке, поэтому заранее прошу прощения за любые тривиальные вопросы, которые я могу задавать.

Моя главная проблема заключается в том, что я не уверен, как изменить «наблюдаемое» Ценности в праздники. Мне нужен праздник, который нужно соблюдать в понедельник, только если он выпадает на воскресенье. Мне не нужно, чтобы в субботу отмечались праздничные дни.

Документация, похоже, имеет решение, только если я хочу полностью, а не частично удалить «наблюдаемые» праздники. Мой обходной путь для этого состоял в том, чтобы создать класс NewCountrysHolidays и заполнить его праздниками и наблюдаемыми статусами, которые я хотел. Я прикрепил свой код для нового класса ниже.

Моя новая проблема заключается в том, что я получаю код ошибки: 'datetime.date' object is not callable, когда я делаю 1-1-2015 in us_electric_holidays, но он работает с метками времени с моими данными. Когда я использую свои данные, я получаю новую ошибку name 'SUN' is not defined. Похоже, не распознать будни бывших. СОЛНЦЕ, и месяцы отл. DE C. Я не уверен, почему.

Я прошу прощения, если это было многословно, но я ценю и благодарю вас за любую помощь в решении этой проблемы.

Предыстория проблемы: (Если интересно) Я являюсь Электротехника кандидат технических наук студент, который специализируется на электросети. Одна из моих задач - анализ данных энергетических компаний. Энергетические компании определяют праздник как:

Праздники - это Новый год, День президента, День памяти, День независимости, День труда, День ветеранов, День благодарения и Рождество. Если какой-либо выходной день выпадает на воскресенье, следующий понедельник будет считаться выходным. Однако в праздничные дни, приходящиеся на субботу, никаких изменений не будет.

Чтобы все данные были правильно помечены, мне нужно удалить День Мартина Лютера Кинга и День Колумба. Затем удалите наблюдаемую субботу из праздника пятницы.

Я реализовал все это в приведенном ниже коде, но он не запустится.

код для класса праздников (он длинный, но 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()

1 Ответ

2 голосов
/ 14 марта 2020

Я работаю над той же проблемой (NER C праздники для электричества c power) и увидел ваш вопрос. Ответ Пьера Буткина на связанный вопрос привел меня к гораздо более быстрому решению: просто замените 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)
    ]
...