如何基于指定日期生成工作日范围并添加为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
相关产品推荐
相关产品推荐

