Как удалить определенный праздник из Pandas USFederalHolidayCalendar?

python #python-3.x #pandas #datetime #object

#python #python-3.x #pandas #дата и время #объект

Вопрос:

Я пытаюсь удалить День Колумба из pandas.tseries.holiday.USFederalHolidayCalendar .

Кажется, это возможно, как одноразовая операция, с

 from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
cal = cal.rules.pop(6)
 

Однако, если этот код находится внутри функции, которая вызывается повторно (в цикле) для генерации нескольких независимых выходных данных, я получаю следующую ошибку:

 IndexError: pop index out of range
 

У меня создается впечатление, что объект остается в своем начальном загруженном состоянии, и по мере выполнения цикла он отображает праздники с индексом 6, пока они не исчезнут, а затем выдает ошибку.

Я пытался перезагрузить через importlib.reload безрезультатно.

Есть идеи, что я делаю не так?

Комментарии:

1. Я немного неясен. Вы перезаписали весь календарь ( cal ) результатом заполнения правил. pop возвращает только удаленный элемент, поэтому вы сократили cal calendar ( <class 'pandas.tseries.holiday.USFederalHolidayCalendar'> ) до одного правила ( <class 'pandas.tseries.holiday.Holiday'> ) .

2. когда я делаю это на панели отладки, я вижу, что исчезает только всплывающий элемент, в то время cal как в остальном он остается нетронутым, т. Е. Оставшиеся правила все еще существуют после pop

Ответ №1:

 # Import your library
from pandas.tseries.holiday import USFederalHolidayCalendar

# Get an id of 'columbus' in 'rules' list
columbus_index = USFederalHolidayCalendar().rules.index([i for i in USFederalHolidayCalendar().rules if 'Columbus' in str(i)][0])

# Create your own class, inherit 'USFederalHolidayCalendar'
class USFederalHolidayCalendar(USFederalHolidayCalendar):
    # Exclude 'columbus' entry
    rules = USFederalHolidayCalendar().rules[:columbus_index]   USFederalHolidayCalendar().rules[columbus_index 1:]

# Create an object from your class
cal = USFederalHolidayCalendar()
print(cal.rules)
 
 [Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x7f6afad571f0>),
 Holiday: Martin Luther King Jr. Day (month=1, day=1, offset=<DateOffset: weekday=MO( 3)>),
 Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: weekday=MO( 3)>),
 Holiday: Memorial Day (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
 Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f6afad571f0>),
 Holiday: Labor Day (month=9, day=1, offset=<DateOffset: weekday=MO( 1)>),
 Holiday: Veterans Day (month=11, day=11, observance=<function nearest_workday at 0x7f6afad571f0>),
 Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: weekday=TH( 4)>),
 Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x7f6afad571f0>)]


 

Ответ №2:

Проблема здесь в том, что rules это атрибут класса (список объектов). Смотрите код, взятый отсюда:

 class USFederalHolidayCalendar(AbstractHolidayCalendar):
    """
    US Federal Government Holiday Calendar based on rules specified by:
    https://www.opm.gov/policy-data-oversight/
       snow-dismissal-procedures/federal-holidays/
    """

    rules = [
        Holiday("New Years Day", month=1, day=1, observance=nearest_workday),
        USMartinLutherKingJr,
        USPresidentsDay,
        USMemorialDay,
        Holiday("July 4th", month=7, day=4, observance=nearest_workday),
        USLaborDay,
        USColumbusDay,
        Holiday("Veterans Day", month=11, day=11, observance=nearest_workday),
        USThanksgivingDay,
        Holiday("Christmas", month=12, day=25, observance=nearest_workday),
    ]
 

Поскольку атрибут определен в классе, существует только один базовый список, на который ссылаются, поэтому, если операции над разными экземплярами этого класса будут пытаться редактировать список, у вас будет нежелательное поведение. Вот пример, который показывает, что происходит:

 >>> class A:
...     rules = [0,1,2]
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.rules.pop()
2
>>> a1.rules.pop()
1
>>> a2.rules.pop()
0
>>> a2.rules.pop()
IndexError: pop from empty list
>>> a3 = A()
>>> a3.rules
[]
 

Кроме того, каждый модуль в python импортируется только один раз

Комментарии:

1. Спасибо… видите ли вы какое-либо решение для удаления определенного праздника?

2. @pepe Может быть, перед удалением какого-либо элемента сделать глубокую копию списка правил??