
本文介绍如何在 Python 中将给定的周序号列表(如 [2, 3, ..., 18])准确转换为以星期二为起始日的日期范围,生成 wk_starting(每周首日)和 wk_composed_of(每周日期区间)两个结构化结果。
本文介绍如何在 python 中将给定的周序号列表(如 `[2, 3, ..., 18]`)准确转换为以星期二为起始日的日期范围,生成 `wk_starting`(每周首日)和 `wk_composed_of`(每周日期区间)两个结构化结果。
在实际业务场景中(如数据采集、报表周期对齐),常需按自定义周起始日(非 ISO 标准周一或周日)划分时间周期。本例中,2024 年数据自 1 月 2 日(星期二) 开始,因此第 1 周为 2024-01-02 至 2024-01-08,后续每周顺延 7 天。关键在于:不依赖 isocalendar()(其默认以周一为周始且受 ISO 年份边界影响),而采用基于基准日的偏移计算。
以下为完整、健壮的实现方案:
✅ 步骤一:定义基准日并生成连续日期序列
from datetime import datetime, timedelta
# 明确业务起点:2024年1月2日(星期二)为 Week 1 的第一天
base_date = datetime(2024, 1, 2)
wks = list(range(2, 19)) # 示例:[2, 3, ..., 18]
# 生成所有目标周对应的起始日期(每个起始日 = base_date + (week_num - 1) * 7 天)
wk_starting = [
(base_date + timedelta(weeks=w - 1)).strftime('%b %d, %Y')
for w in wks
]✅ 步骤二:推导每周覆盖的完整日期区间
def week_range_str(start_dt: datetime) -> str:
end_dt = start_dt + timedelta(days=6) # 周二 → 下周一(共7天)
return f"{start_dt.strftime('%b %d')} - {end_dt.strftime('%b %d')}"
wk_composed_of = [
week_range_str(base_date + timedelta(weeks=w - 1))
for w in wks
]✅ 最终结果示例
print("wk_starting:", wk_starting[:3])
# ['Jan 09, 2024', 'Jan 16, 2024', 'Jan 23, 2024']
print("wk_composed_of:", wk_composed_of[:3])
# ['Jan 09 - Jan 15', 'Jan 16 - Jan 22', 'Jan 23 - Jan 29']⚠️ 注意事项
- 勿混用 strftime('%U') 或 '%W':它们以周日/周一为周始,且从每年第一个完整周计数,无法匹配“1月2日即 Week 1”的业务逻辑。
- 闰年与跨月处理已自动兼容:timedelta 精确处理日期进位(如 2024-02-29 后自然进入 3 月)。
- 若需包含年份(如跨年场景):可将格式化字符串改为 '%b %d, %Y' 并在 week_range_str 中统一添加年份逻辑。
- 扩展性建议:可封装为函数 get_week_dates(year: int, week_list: list, first_week_start: datetime),便于复用。
该方法逻辑清晰、无外部依赖、完全可控,是处理非标准周历需求的推荐实践。


















