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

Pandas bdate_range指定freq='BQ'时返回结果含周末日期的疑问

问题说明

你的用法存在错误,核心问题有两点:

  • 对freq参数的逻辑理解有误:传入freq='BQ'时,bdate_range只会返回时间范围内每个业务季度的季度末单个锚点日期,根本不会生成季度内的所有工作日列表,和你的初始需求不匹配。
  • Pandas 1.2.3版本存在偏移量逻辑缺陷:该版本下BQ(业务季度末)频率不会自动把落在周末的锚点向前调整到最近工作日,因此会返回属于周日的2017-12-31。
正确实现

如果要生成指定时间范围内、分属各业务季度的所有工作日列表,按如下代码编写即可:

import pandas as pd
import datetime

# 生成指定区间内全部工作日,默认freq='B'即为排除周末的工作日频率
all_workdays = pd.bdate_range(
    start=datetime.date(2015, 1, 1),
    end=datetime.date(2019, 1, 1)
)

# 按业务季度分组,得到每个季度对应的工作日列表
quarter_workdays = {}
for q, days in all_workdays.groupby(all_workdays.to_period('BQ')):
    quarter_workdays[str(q)] = days

如果你原本的需求只是获取每个业务季度的最后一个工作日,在1.2.3版本下可以通过如下方式规避版本bug,不需要升级pandas:

all_workdays = pd.bdate_range(
    start=datetime.date(2015, 1, 1),
    end=datetime.date(2019, 1, 1)
)
# 取每个业务季度内的最后一个工作日
bq_last_workdays = all_workdays.groupby(all_workdays.to_period('BQ')).max()

校验结果:上述代码返回的2017年第四季度最后一个工作日为2017-12-29(周五),不存在周末日期混入的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:42:23