基于日期列给DataFrame新增长假期前后标识列的实现求助
实现长假期前后工作日标记的方法
核心思路
通过标记连续的非工作日时段,筛选出长度≥3天的长假期,再定位长假期的前一天和后一天(需为工作日),分别标记为1,其余为0。
完整代码实现
import pandas as pd import numpy as np # ---------------------- # 1. 构造示例数据(可替换为你的真实数据) # ---------------------- dates = pd.date_range(start='2024-09-25', end='2024-10-10') # 模拟国庆长假:10.1-10.7为非工作日(holiday=1),其余为工作日(holiday=0) holiday = [0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0] df = pd.DataFrame({'Date': dates, 'temp_data': np.random.randn(len(dates)), 'holiday': holiday}) # ---------------------- # 2. 标记长假期及前后工作日 # ---------------------- # 给连续的holiday时段分组:相邻行holiday值变化时,分组ID累加 df['holiday_group'] = (df['holiday'] != df['holiday'].shift()).cumsum() # 计算每个分组的连续天数,每行同步获取所在组的长度 df['group_length'] = df.groupby('holiday_group')['holiday'].transform('count') # 标记属于长假期的行(连续≥3天的非工作日) df['is_long_holiday'] = (df['holiday'] == 1) & (df['group_length'] >= 3) # 生成pre_long_holiday:长假期前一天(工作日)标1,其余0 df['pre_long_holiday'] = (df['is_long_holiday'].shift(1) == True) & (df['holiday'] == 0) df['pre_long_holiday'] = df['pre_long_holiday'].astype(int) # 生成post_long_holiday:长假期后一天(工作日)标1,其余0 df['post_long_holiday'] = (df['is_long_holiday'].shift(-1) == True) & (df['holiday'] == 0) df['post_long_holiday'] = df['post_long_holiday'].astype(int) # 清理中间辅助列(可选) df = df.drop(['holiday_group', 'group_length', 'is_long_holiday'], axis=1)
关键步骤说明
- 连续时段分组:通过
shift()对比相邻行的holiday值,变化时累加分组ID,确保连续相同的非工作日被归为同一组。 - 长假期筛选:用
transform()计算每组的连续天数,筛选出长度≥3的非工作日组。 - 前后日期标记:
shift(1)获取下一行的长假期标记,结合当前行是工作日,标记长假期前一天;shift(-1)获取上一行的长假期标记,结合当前行是工作日,标记长假期后一天;- 最后将布尔值转为0/1整数,符合需求格式。
内容的提问来源于stack exchange,提问作者Bella_18
相关产品推荐
相关产品推荐

