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}'")
代码说明
- 获取上月自然首尾日:
prev_month_first:通过当前日期减去当月已过天数,再替换为1号,得到上月第一天;prev_month_last:当前日期减去当月已过天数,直接得到上月最后一天(比如7月10日减10天就是6月30日)。
- 周末调整逻辑:
- 用
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
相关产品推荐
相关产品推荐

