You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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"

为什么这个方法更可靠?

  1. 完全贴合官方定义:黑色星期五的本质就是感恩节后的第一天,直接基于感恩节日期偏移能确保100%符合规则,不会受当月周数分布的影响。
  2. 复用成熟逻辑:父类holidays.UnitedStates已经处理了感恩节的所有边界情况,你不需要重复编写日期计算逻辑,避免出错。

验证示例

拿2019年来说:

  • 感恩节是11月28日(当月第4个周四)
  • 黑色星期五应为11月29日(当月第5个周五)
    修改后的代码会正确添加11月29日,而原代码会错误地将11月22日(第4个周五)标记为黑色星期五。

内容的提问来源于stack exchange,提问作者cphill

火山引擎 最新活动