Python使用Pandas获取当月最后工作日时BMonthEnd跳转下月如何解决
问题根源
Pandas 内置的BMonthEnd(工作日月末偏移)默认行为导致该问题:如果输入日期本身已经是当月最后一个工作日,直接执行加法操作时,偏移量会自动向后跳转一个月,返回下月最后一个工作日。
解决方案
方案1:使用rollforward方法(可读性高)
BMonthEnd自带的rollforward方法会自动判断输入日期是否符合月末工作日规则,符合则直接返回原日期,不符合则偏移到当月月末工作日:
import pandas as pd from pandas.tseries.offsets import BMonthEnd # 构造测试数据集 df = pd.DataFrame({ 'DATA':['2021-10-06','2021-10-05','2021-10-04','2021-10-01','2021-09-30','2021-09-29 ','2021-09-28','2021-09-27 '] }) # 先将DATA列转为标准日期格式,同时去除前后空格 df['DATA'] = pd.to_datetime(df['DATA'].str.strip()) # 定义工作日月末偏移对象 bme = BMonthEnd() # 对日期列应用rollforward方法 df['DATA2'] = df['DATA'].apply(bme.rollforward)
方案2:先减1天再加偏移(性能更高,无需apply)
通过先给日期减1天的方式,规避原日期是月末工作日的跳转问题,适合大数据量场景:
df['DATA2'] = df['DATA'] - pd.DateOffset(days=1) + BMonthEnd()
验证输出
两种方案最终输出结果一致,符合预期:
DATA DATA2 0 2021-10-06 2021-10-29 1 2021-10-05 2021-10-29 2 2021-10-04 2021-10-29 3 2021-10-01 2021-10-29 4 2021-09-30 2021-09-30 5 2021-09-29 2021-09-30 6 2021-09-28 2021-09-30 7 2021-09-27 2021-09-30
拓展说明
如果需求是提取当月自然月最后一天(不限制工作日),将上述代码中的BMonthEnd替换为MonthEnd即可,使用逻辑完全相同。
内容的提问来源于stack exchange,提问作者Eric Alves
相关产品推荐
相关产品推荐

