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
相关产品推荐
相关产品推荐

