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 Может быть, перед удалением какого-либо элемента сделать глубокую копию списка правил??