如何使用pandas获取上一年对应日期的最近工作日(周末取前序工作日)
上一年对应有效工作日获取实现
需求规则
计算指定日期的上一年对应有效工作日,规则如下:
- 先取上一年的自然同日
- 若该自然同日为周末,返回距离该日期最近的前一个工作日(不向后取值)
- 预期校验结果:
- 输入
2021-06-25(周五),返回2020-06-25(周四) - 输入
2022-06-26(周日),返回2021-06-25(周五)
- 输入
原有代码问题
原实现直接通过pd.DateOffset(years=1)计算上一年日期,没有做周末校准,拿到的是上一年自然日,无法匹配工作日规则要求。
修正代码
直接使用pandas内置的BDay(工作日偏移)的rollback方法即可实现往前找最近工作日的逻辑,完整可运行代码如下:
import pandas as pd from pandas.tseries.offsets import BDay # 构建测试数据集 df = pd.DataFrame({'Date':['20210625','20220626'],'Amount':[10,20]}) df['Date'] = pd.to_datetime(df['Date'], infer_datetime_format=True) date_1 = df['Date'].iloc[-1] # 第一步:取上一年自然同日 last_year_raw = date_1 - pd.DateOffset(years=1) # 第二步:向前滚动到最近的工作日,周末自动回退到上一个周五 date_2 = BDay().rollback(last_year_raw) df_2 = df[df['Date'] == date_2]
逻辑说明:
BDay().rollback(传入日期)的判定规则为:如果传入日期本身是工作日,直接返回原日期;如果是周六/周日,自动返回之前最近的周五,完全匹配需求规则。
结果校验
运行代码后两个测试场景的计算结果完全符合预期:
- 对
2021-06-25,上一年自然同日为2020-06-25(周四,工作日),直接返回原值 - 对
2022-06-26,上一年自然同日为2021-06-26(周六),自动回退返回2021-06-25(周五)
内容的提问来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

