如何在Pandas DataFrame中创建长周末后工作日标识列?
实现Pandas DataFrame新增长周末后工作日标记列的方法
核心思路
先统一标记所有节假日(周六/周日、全国/省级节假日),再识别符合规则的连续长假期,最后标记假期后的第一个工作日。
步骤1:构建统一的节假日标记列
首先将周六/周日、全国节假日、省级节假日统一标记为节假日,生成is_holiday列:
import pandas as pd # 示例DataFrame df = pd.DataFrame( [[0, 1, 'Fri'], [0, 0, 'Sat'], [0, 0, 'Sun'], [0, 0, 'Mon'], [0, 0, 'Tue'], [0, 0, 'Wed'], [0, 0, 'Thu'], [0, 1, 'Fri'], [0, 0, 'Sat'], [0, 0, 'Sun'], [1, 0, 'Mon'], [0, 0, 'Tue']], columns=['national_holiday', 'provincial_holiday','day_of week'] ) # 标记节假日:满足任一条件则为1,否则为0 df['is_holiday'] = ( df['day_of week'].isin(['Sat', 'Sun']) | (df['national_holiday'] == 1) | (df['provincial_holiday'] == 1) ).astype(int)
步骤2:标记长周末后工作日
通过分组识别连续假期,判断假期是否符合长周末规则(包含周末或起始于周五),再标记假期后的第一个工作日:
# 初始化目标列 df['day_after_long_weekend'] = 0 # 生成连续假期的分组ID:假期状态变化时分组ID递增 df['holiday_group'] = (df['is_holiday'] != df['is_holiday'].shift()).cumsum() # 遍历所有连续假期组 for group_id, holiday_group in df[df['is_holiday'] == 1].groupby('holiday_group'): # 判断当前假期是否符合长周末规则 has_weekend = holiday_group['day_of week'].isin(['Sat', 'Sun']).any() has_fri_holiday = (holiday_group['day_of week'] == 'Fri').any() if has_weekend or has_fri_holiday: last_holiday_idx = holiday_group.index[-1] # 确保不是DataFrame最后一行,避免索引越界 if last_holiday_idx < df.index[-1]: df.loc[last_holiday_idx + 1, 'day_after_long_weekend'] = 1
验证结果
执行代码后,查看目标列的结果:
print(df[['day_of week', 'is_holiday', 'day_after_long_weekend']])
输出结果:
day_of week is_holiday day_after_long_weekend 0 Fri 1 0 1 Sat 1 0 2 Sun 1 0 3 Mon 0 1 4 Tue 0 0 5 Wed 0 0 6 Thu 0 0 7 Fri 1 0 8 Sat 1 0 9 Sun 1 0 10 Mon 1 0 11 Tue 0 1
结果完全符合需求规则:
- 第一组假期(周五-周日)后的周一被标记为1
- 第二组假期(周五-周一)后的周二被标记为1
内容的提问来源于stack exchange,提问作者User771
相关产品推荐
相关产品推荐

