You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期范围创建二进制变量 标记节日前后一周的行

解决方案

完整可运行代码

import pandas as pd
import numpy as np
import holidays
from datetime import timedelta

# 构建测试数据
df = pd.DataFrame({'Date': ['1/1/2019', '1/5/2019', '12/28/2018'],
                   'Event': ['Music', 'Poetry', 'Theatre'],
                   'Cost': [10000, 5000, 15000]})
df['newDate'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')

# 通用节日窗口标记函数
def mark_holiday_window(df, date_col, holiday_obj, window_days=7):
    # 转换所有节日日期为datetime格式
    holiday_dates = pd.to_datetime(list(holiday_obj.keys()))
    # 为每个节日生成前后N天的时间窗口
    holiday_windows = [(d - timedelta(days=window_days), d + timedelta(days=window_days)) for d in holiday_dates]
    # 批量判断日期是否落在任意节日窗口内
    is_in_window = df[date_col].apply(lambda x: any(start <= x <= end for start, end in holiday_windows))
    return np.where(is_in_window, 1, 0)

# ------------------- 元旦标记示例 -------------------
new_year_holidays = holidays.HolidayBase()
new_year_holidays.append({
    "2018-01-01": "New Year's Day",
    "2019-01-01": "New Year's Day"
})
df['hol_new_year'] = mark_holiday_window(df, 'newDate', new_year_holidays, window_days=7)

# ------------------- 感恩节标记示例(可替换为任意节日) -------------------
us_holidays = holidays.US(years=[2018,2019])
thanksgiving_holidays = holidays.HolidayBase()
for date, name in us_holidays.items():
    if 'Thanksgiving' in name:
        thanksgiving_holidays.append({date: name})
df['hol_thanksgiving'] = mark_holiday_window(df, 'newDate', thanksgiving_holidays, window_days=7)

print(df)

核心逻辑说明

  • 通用适配:只要传入holidays库支持的任意节日对象,就能实现复活节、圣诞节等不同节日的窗口标记,支持自定义国家/地区的节日规则
  • 窗口可调整:修改window_days参数即可自定义前后覆盖的天数,设置为0即仅标记节日当天
  • 修正了原有代码的逻辑错误:原代码直接对整个日期列用in判断,无法实现逐行匹配,改为向量式批量判断后运行效率更高

运行上述代码后,测试数据里的3行日期均落在2019年元旦前后7天范围内,hol_new_year字段值全部为1,符合预期效果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:54:03