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

Python基于指定日期获取上月首个及最后一个工作日的问题求助

解决方案

要正确获取上月的首个和最后一个工作日,核心是判断日期是否为周末并做相应调整——原代码仅取了上月的自然首尾日,未考虑周末情况,因此遇到周末时结果会出错。以下是修正后的代码:

from datetime import datetime, timedelta

run_date = '2024-07-10'  # 测试上月为6月的场景
d = datetime.strptime(run_date, '%Y-%m-%d').date()

# 计算上月第一天
prev_month_first = (d - timedelta(days=d.day)).replace(day=1)
# 调整为首个工作日:周六加2天,周日加1天,工作日直接保留
if prev_month_first.weekday() == 5:  # 周六对应weekday()返回5
    first_business_day = prev_month_first + timedelta(days=2)
elif prev_month_first.weekday() == 6:  # 周日对应weekday()返回6
    first_business_day = prev_month_first + timedelta(days=1)
else:
    first_business_day = prev_month_first

# 计算上月最后一天
prev_month_last = d - timedelta(days=d.day)
# 调整为最后一个工作日:周六减1天,周日减2天,工作日直接保留
if prev_month_last.weekday() == 5:
    last_business_day = prev_month_last - timedelta(days=1)
elif prev_month_last.weekday() == 6:
    last_business_day = prev_month_last - timedelta(days=2)
else:
    last_business_day = prev_month_last

# 格式化输出为字符串
first_business_day_str = first_business_day.strftime("%Y-%m-%d")
last_business_day_str = last_business_day.strftime("%Y-%m-%d")

print(f"first_business_day = '{first_business_day_str}'")
print(f"last_business_day = '{last_business_day_str}'")

代码说明

  1. 获取上月自然首尾日:
    • prev_month_first:通过当前日期减去当月已过天数,再替换为1号,得到上月第一天;
    • prev_month_last:当前日期减去当月已过天数,直接得到上月最后一天(比如7月10日减10天就是6月30日)。
  2. 周末调整逻辑:
    • 用weekday()方法判断日期:0=周一,4=周五,5=周六,6=周日;
    • 首个工作日:周六跳至下周一(+2天),周日跳至下周一(+1天);
    • 最后一个工作日:周六退至上周五(-1天),周日退至上周五(-2天)。

测试验证

当run_date = '2024-07-10'时,输出结果为:

first_business_day = '2024-06-03'
last_business_day = '2024-06-29'

完全符合预期;当run_date = '2024-06-10'时,输出2024-05-01和2024-05-31,同样正确。

扩展说明

如果需要考虑法定节假日,还需结合节假日列表做额外判断;但如果仅需排除周末,以上代码足够满足需求。

内容的提问来源于stack exchange,提问作者nmr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:43:18