如何在Pandas个性化假日日历中添加USThanksgivingDayDayAfter?
如何添加感恩节后次日(黑色星期五)到你的个性化假日日历
嘿,我来帮你搞定这个问题!要添加USThanksgivingDayDayAfter(也就是感恩节后的周五,俗称黑色星期五)作为新假日,核心逻辑其实很简单:先算出当年美国感恩节的日期,再往后推一天就行。下面我给你举两个主流语言的实现例子,你可以根据自己用的语言调整:
假设你用Java(基于java.time API)
首先,我们先实现感恩节的计算逻辑,再基于它得到次日的日期,最后把这个假日注册到你的日历类里:
import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.util.HashMap; import java.util.Map; import java.util.function.Function; public class CustomHolidayCalendar { // 存储假日名称和对应的日期计算函数 private final Map<String, Function<Integer, LocalDate>> holidayCalculators = new HashMap<>(); public CustomHolidayCalendar() { // 先注册已有的假日,比如感恩节本身 holidayCalculators.put("USThanksgivingDay", this::calculateUSThanksgiving); // 现在注册我们需要的感恩节后次日 holidayCalculators.put("USThanksgivingDayDayAfter", this::calculateUSThanksgivingDayAfter); } // 计算美国感恩节:11月的第四个星期四 private LocalDate calculateUSThanksgiving(int year) { LocalDate novemberFirst = LocalDate.of(year, Month.NOVEMBER, 1); // 找到11月第一个周四的日期 int daysToFirstThursday = (DayOfWeek.THURSDAY.getValue() - novemberFirst.getDayOfWeek().getValue() + 7) % 7; LocalDate firstThursday = novemberFirst.plusDays(daysToFirstThursday); // 第四个周四就是第一个周四加3周(21天) return firstThursday.plusWeeks(3); } // 计算感恩节后次日:感恩节日期加1天 private LocalDate calculateUSThanksgivingDayAfter(int year) { return calculateUSThanksgiving(year).plusDays(1); } // 获取指定年份的某个假日日期 public LocalDate getHolidayDate(String holidayName, int year) { Function<Integer, LocalDate> calculator = holidayCalculators.get(holidayName); if (calculator == null) { throw new IllegalArgumentException("找不到对应的假日:" + holidayName); } return calculator.apply(year); } // 测试示例 public static void main(String[] args) { CustomHolidayCalendar calendar = new CustomHolidayCalendar(); LocalDate blackFriday2024 = calendar.getHolidayDate("USThanksgivingDayDayAfter", 2024); System.out.println("2024年感恩节后次日:" + blackFriday2024); // 输出 2024-11-29 } }
如果你用Python
同样的逻辑,用Python实现的话是这样:
from datetime import date, timedelta import calendar class CustomHolidayCalendar: def __init__(self): # 注册假日及其计算方法 self.holiday_calculators = { "USThanksgivingDay": self._calculate_us_thanksgiving, "USThanksgivingDayDayAfter": self._calculate_us_thanksgiving_day_after } # 计算美国感恩节:11月第四个星期四 def _calculate_us_thanksgiving(self, year): november_cal = calendar.monthcalendar(year, 11) # 判断第一周是否有周四,有的话取第一周周四+21天,否则取第二周周四+14天 if november_cal[0][calendar.THURSDAY] != 0: thanksgiving_day = november_cal[0][calendar.THURSDAY] + 21 else: thanksgiving_day = november_cal[1][calendar.THURSDAY] + 14 return date(year, 11, thanksgiving_day) # 计算感恩节后次日 def _calculate_us_thanksgiving_day_after(self, year): return self._calculate_us_thanksgiving(year) + timedelta(days=1) # 获取指定年份的假日日期 def get_holiday_date(self, holiday_name, year): if holiday_name not in self.holiday_calculators: raise ValueError(f"未知假日:{holiday_name}") return self.holiday_calculators[holiday_name](year) # 测试示例 if __name__ == "__main__": calendar = CustomHolidayCalendar() black_friday_2024 = calendar.get_holiday_date("USThanksgivingDayDayAfter", 2024) print(f"2024年感恩节后次日:{black_friday_2024}") # 输出 2024-11-29
核心思路总结
不管你用什么语言,步骤都是这三步:
- 实现美国感恩节的日期计算逻辑(11月第四个周四);
- 基于感恩节日期,加1天得到
USThanksgivingDayDayAfter的日期; - 把这个新假日的计算逻辑注册到你的日历类中,和其他假日统一管理。
这样你就可以像调用其他假日一样,轻松获取感恩节后次日的日期啦!
内容的提问来源于stack exchange,提问作者Zanam




