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

如何基于指定日期生成工作日范围并添加为DataFrame列

实现方案

直接用pandas内置的日期生成能力即可完成,不需要手动遍历判断周末,完整代码如下:

import pandas as pd

# 1. 构造原始DataFrame
df = pd.DataFrame({
    'ticker': ['6762 JP Equity'],
    'ex_date': ['2021-09-29']
})
# 必须先将日期列转为datetime类型,否则无法进行日期运算
df['ex_date'] = pd.to_datetime(df['ex_date'])

# 2. 取基准值
center_date = df.loc[0, 'ex_date']
fixed_ticker = df.loc[0, 'ticker']

# 3. 生成目标日期范围:以中心日期为基准前后5个自然日内的所有工作日,和给出的预期结果完全匹配
target_dates = pd.date_range(
    start=center_date - pd.Timedelta(days=5),
    end=center_date + pd.Timedelta(days=5),
    freq='B'  # freq='B' 代表工作日频率,自动跳过周六、周日
)

# 4. 构造新的DataFrame
result = pd.DataFrame({
    'ticker': [fixed_ticker] * len(target_dates),
    'ex_date': target_dates
})

# 如果需要和示例里一样索引全为0,打开下面这行注释即可
# result.index = [0] * len(result)

运行后得到的result内容和预期完全一致:

ticker    ex_date
0  6762 JP Equity 2021-09-24
1  6762 JP Equity 2021-09-27
2  6762 JP Equity 2021-09-28
3  6762 JP Equity 2021-09-29
4  6762 JP Equity 2021-09-30
5  6762 JP Equity 2021-10-01
6  6762 JP Equity 2021-10-04

其他场景调整

如果你需要严格按照「向前推N个工作日、向后推N个工作日」的规则计算(不按自然日范围取),可以用pd.offsets.BDay()工作日偏移量实现,比如要严格向前取3个工作日、向后取3个工作日(和当前预期结果匹配),替换掉第3步的日期生成代码即可:

# 向前3个工作日(按偏移量倒序生成,保证最终日期从小到大排列)
forward_dates = [center_date - pd.offsets.BDay(i) for i in range(3, 0, -1)]
# 向后3个工作日
backward_dates = [center_date + pd.offsets.BDay(i) for i in range(1, 4)]
# 拼接所有日期:前序日期 + 中心日期 + 后序日期
target_dates = forward_dates + [center_date] + backward_dates

如果需要前后各取5个工作日,把代码里的3改成5、4改成6即可。

注意事项

  • 默认的工作日规则仅排除周六周日,如果需要适配不同国家/地区的法定节假日,可以自定义工作日日历传入日期生成逻辑
  • 所有日期运算的前提是ex_date列已经转为datetime类型,否则会触发类型报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:54:18