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

基于日期列给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:20:35