如何基于日期范围创建二进制变量 标记节日前后一周的行
解决方案
完整可运行代码
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
相关产品推荐
相关产品推荐

