You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:50:05