Python如何根据周数获取对应周的起始日期(周始为周一)
问题原因
原代码逻辑存在核心错误,导致结果不符合预期:
- 直接以每年1月1日为起点累加周数,没有对齐「周起始为周一」的规则:每年1月1日可能是一周中的任意一天,直接累加7的倍数得到的日期自然不会固定是周一。
- 没有遵循ISO周数的通用计数规则:通用周数计数规则为每年第1周是包含1月4日(即至少4天属于新一年)的周,周一是每周第一天,并非从1月1日所在的自然周开始计数周数。
- 你给出的示例中周数25对应周一日期
2022-06-21存在笔误,实际2021年第25周的周一就是2021-06-21,传入对应年份即可匹配结果。
实现代码
直接使用Python标准库即可实现需求,不需要额外依赖dateutil,提供两种兼容方案:
方案1:格式符直接解析(Python 3.6+ 支持)
利用datetime.strptime内置的ISO周格式符直接解析,代码最简洁:
import datetime from typing import List def get_week_monday(iso_year: int, week_num: int) -> datetime.date: # 格式符说明:%G=ISO周所属年份,%V=补零的ISO周数,%u=周几(周一为1) return datetime.datetime.strptime(f"{iso_year}-{week_num}-1", "%G-%V-%u").date() # 批量处理周数列表 week_list: List[int] = [25, 26, 27] target_iso_year = 2021 # 替换为需要查询的周数所属年份 for week in week_list: monday_date = get_week_monday(target_iso_year, week) print(f"第{week}周 周一日期:{monday_date}")
运行输出:
第25周 周一日期:2021-06-21 第26周 周一日期:2021-06-28 第27周 周一日期:2021-07-05
完全匹配你给出的周25对应日期示例。
方案2:手动计算兼容低版本
如果需要兼容Python 3.6以下版本,可以手动对齐第一周的周一后累加:
import datetime from typing import List def get_week_monday(iso_year: int, week_num: int) -> datetime.date: # 每年1月4日一定属于当年第1个ISO周 jan_4th = datetime.date(iso_year, 1, 4) # 计算第1周的周一日期 first_week_monday = jan_4th - datetime.timedelta(days=jan_4th.isoweekday() - 1) # 累加对应周数(第1周无需累加,所以周数减1) return first_week_monday + datetime.timedelta(weeks=week_num - 1) # 调用方式和方案1完全一致 week_list: List[int] = [25, 26, 27] target_iso_year = 2021 for week in week_list: print(f"第{week}周 周一日期:{get_week_monday(target_iso_year, week)}")
注意事项
- 跨年周需要传入ISO周所属年份而非自然年,例如2022年最后一周(第52周)的范围是2022-12-26至2023-01-01,查询时传入
iso_year=2022, week_num=52即可拿到正确的周一日期2022-12-26。 - 如果你的周数计数规则不是ISO标准(比如部分场景自定义每年1月1日所在周为第1周),可以在方案2的基础上调整第一周的锚点日期即可。
内容的提问来源于stack exchange,提问作者Firts_is_science
相关产品推荐
相关产品推荐

