为何Pandas的weekday DateOffset仅向前偏移?如何获取月末指定工作日?
获取每月最后一个指定星期几的解决方案
问题根源
你遇到的异常是因为pd.DateOffset的weekday参数逻辑特殊:
- 它并非像
days/day那样做线性日期偏移,而是将日期调整到大于等于当前日期的第一个指定星期几。如果当前日期不是目标星期几,无论用加法还是减法操作,都会返回下一个匹配的日期(这就是加减结果一致的原因)。 - 你使用
DateOffset.rollback()无效,是因为该方法针对的是DateOffset的偏移规则回滚,而非直接从当前日期往回查找目标星期几。正确的回滚应该使用pd.offsets.Week对象的rollback方法。
可行解决方案
方法1:使用WeekOfMonth(推荐)
pd.offsets.WeekOfMonth是专门定位每月第N个星期几的工具,week=-1直接代表“当月最后一个”:
import pandas as pd # 获取2025年10月最后一个周日(周日对应weekday=6) target_date = pd.Timestamp("2025-10-01") + pd.offsets.WeekOfMonth(week=-1, weekday=6) print(target_date) # 输出: Timestamp('2025-10-26 00:00:00')
方法2:使用Week.rollback()
通过pd.offsets.Week的rollback方法,直接从当月最后一天往回查找最近的目标星期几:
import pandas as pd # 先获取当月最后一天 month_last_day = pd.Timestamp("2025-10-31") # 回滚到不晚于该日期的最后一个周日 last_sunday = pd.offsets.Week(weekday=6).rollback(month_last_day) print(last_sunday) # 输出: Timestamp('2025-10-26 00:00:00')
方法3:手动循环查找
如果需要更直观的逻辑,可以从当月最后一天逐步往前遍历,直到找到目标星期几:
import pandas as pd def get_last_weekday_of_month(year, month, target_weekday): # 获取当月最后一天 last_day = pd.Timestamp(year, month, 1) + pd.offsets.MonthEnd(0) # 往前调整到目标星期几 while last_day.weekday() != target_weekday: last_day -= pd.Timedelta(days=1) return last_day # 调用示例:2025年10月最后一个周日(target_weekday=6) result = get_last_weekday_of_month(2025, 10, 6) print(result) # 输出: Timestamp('2025-10-26 00:00:00')
验证说明
2025年10月的周日分别是5日、12日、19日、26日,最后一个周日为26日,上述三种方法均能正确返回该日期,避免了原方法返回11月2日的跨月错误。
内容的提问来源于stack exchange,提问作者Thomas Arildsen
相关产品推荐
相关产品推荐

