如何从Pandas USFederalHolidayCalendar中移除指定节假日并解决循环报错
错误原因
USFederalHolidayCalendar的rules是类级别的可变属性,所有实例共享同一份列表。你直接对实例的rules执行pop,本质是修改了全局共享的类属性,第一次执行后索引6的元素就被永久移除了,后续再调用pop(6)自然会触发索引越界。importlib.reload失效是因为Python的模块重载不会重置已经被修改的类可变属性,内存中已有的类对象修改会被保留。
解决方法
方法1:复制原规则生成独立自定义日历(推荐,无副作用)
不要直接修改原日历的规则,每次需要用到移除哥伦布日的日历时,先深拷贝一份原规则列表,删除对应项后再构造新的日历实例,完全不会影响原类的属性:
from copy import deepcopy from pandas.tseries.holiday import USFederalHolidayCalendar, HolidayCalendar def get_no_columbus_calendar(): # 深拷贝原规则,避免修改原类属性 custom_rules = deepcopy(USFederalHolidayCalendar.rules) # 移除哥伦布日(对应原规则索引6) custom_rules.pop(6) # 返回独立的自定义日历实例 return HolidayCalendar(rules=custom_rules)
循环中每次调用该函数都会生成独立的日历对象,互相之间没有影响,不会出现越界问题。
方法2:全局单次修改类属性
如果你的整个程序所有场景下都不需要哥伦布日,可以在程序初始化阶段仅修改一次类属性,后续所有实例都会生效,不需要循环重复操作:
from pandas.tseries.holiday import USFederalHolidayCalendar # 程序启动时仅执行一次 if len(USFederalHolidayCalendar.rules) > 6: USFederalHolidayCalendar.rules.pop(6)
后续所有USFederalHolidayCalendar()实例化得到的日历都已经移除了哥伦布日,循环调用不会报错。
内容的提问来源于stack exchange,提问作者pepe
相关产品推荐
相关产品推荐

