holidays包中Black Friday日期计算失效:如何固定为感恩节后周五?
解决黑色星期五日期计算不准确的问题
你的问题根源在于直接用「11月第4个周五」来定义黑色星期五,但实际上黑色星期五的核心定义是感恩节的次日——而感恩节是11月的第4个周四,这就导致在某些年份(比如11月1日是周五的年份),感恩节后的周五会是当月的第5个周五,而非第4个,所以你的原方法会出错。
最可靠的方案是直接基于已加载的感恩节日期来计算,因为你已经继承了holidays.UnitedStates,父类的_populate方法已经帮你正确处理了感恩节的日期逻辑,你只需要找到这个日期并加1天即可。
修改后的完整代码
import pandas as pd import numpy as np import calendar as cal from datetime import * from dateutil.relativedelta import * import holidays class CorporateHolidays(holidays.UnitedStates): def _populate(self, year): # 先加载默认美国节假日(已包含正确计算的感恩节) super()._populate(year) # 移除不需要的哥伦布日 columbus_day = date(year, 11, 1) + relativedelta(weekday=MO(+2)) self.pop(columbus_day, None) # 添加自定义节假日 self[date(year, 12, 24)] = "Christmas Eve" self[date(year, 12, 31)] = "New Years Eve" # 基于感恩节日期计算黑色星期五 thanksgiving_date = next(d for d, name in self.items() if name == "Thanksgiving") black_friday = thanksgiving_date + timedelta(days=1) self[black_friday] = "Black Friday"
为什么这个方法更可靠?
- 完全贴合官方定义:黑色星期五的本质就是感恩节后的第一天,直接基于感恩节日期偏移能确保100%符合规则,不会受当月周数分布的影响。
- 复用成熟逻辑:父类
holidays.UnitedStates已经处理了感恩节的所有边界情况,你不需要重复编写日期计算逻辑,避免出错。
验证示例
拿2019年来说:
- 感恩节是11月28日(当月第4个周四)
- 黑色星期五应为11月29日(当月第5个周五)
修改后的代码会正确添加11月29日,而原代码会错误地将11月22日(第4个周五)标记为黑色星期五。
内容的提问来源于stack exchange,提问作者cphill




