如何为datetime对象添加一个月?pandas业务季度偏移计算报错
业务需求与初始实现
- 需求说明:对齐1月、4月、7月、10月起始的季度节点,基于业务季度规则为对应时间节点累加1个工作月,生成符合规则的季度时间范围
- 初始实现代码:
import datetime import pandas as pd start = datetime.date.today() start=start+pd.tseries.offsets.DateOffset(months=1) end = datetime.date(start.year+2, 12, 31) business_days_rng =pd.date_range(start, end, freq='BQ')
运行时触发报错
不再支持整数及整数数组与Timestamp执行加减运算;请勿对
n做直接加减操作,请改用n * obj.freq的形式实现偏移计算。
问题根因
- 高版本pandas(2.0及以上)收紧了时间对象运算的兼容校验:混用原生
datetime.date对象与pandas偏移对象做加减时,会被误判定为非兼容的整数与时间戳直接运算逻辑,触发报错 - 原代码使用的
BQ频率默认对齐季度最后一个工作日,和需求中“1月、4月、7月为季度起点”的对齐规则不匹配
修正实现方案
- 统一将所有原生时间对象转换为
pd.Timestamp类型后再做偏移运算,避免类型不匹配的校验问题 - 按照pandas兼容校验规则,偏移量采用
倍数 * 偏移规则的形式书写 - 替换季度频率参数为
BQS,对齐季度首月的工作日节点,匹配1月、4月、7月的业务季度规则 - 修正后可运行代码:
import datetime import pandas as pd # 转换为Timestamp类型初始化起始时间 start = pd.Timestamp(datetime.date.today()) # 采用兼容写法实现加1个月的偏移 start = start + 1 * pd.DateOffset(months=1) # 转换为Timestamp类型初始化结束时间 end = pd.Timestamp(datetime.date(start.year + 2, 12, 31)) # 使用BQS频率对齐业务季度起始工作日 business_days_rng = pd.date_range(start, end, freq='BQS')
内容的提问来源于stack exchange,提问作者TIMOTHY PETERSON
相关产品推荐
相关产品推荐

