如何实现跨年度带2个月重叠的4个月周期yyyy-mm格式日期循环输出?
解决跨年度的4个月周期重叠日期生成问题
需求回顾
- 生成yyyy-mm格式的日期序列,每个周期包含4个连续月份
- 相邻周期重叠2个月(即下一个周期的起始月份比当前周期晚2个月)
- 支持跨年度生成(比如从2020-11到2021-02的周期)
原代码问题分析
- 按年度嵌套循环的逻辑,无法处理跨年度的月份衔接(比如2020年11月起始的周期会延伸到2021年)
- 循环步长设置错误(
range(0,13,3)步长为3,不符合每次跳2个月的需求) - 月份未补前导零,输出格式不规范
- 语法错误(
while循环缺少冒号,break逻辑无效)
解决思路
核心是把日期转换为总月份数进行统一计算,避免拆分年度处理:
- 将起始/结束日期转换为「年份×12 + 月份」的总月份数,这样跨年度的月份可以用连续数字表示
- 每个周期的起始总月份,从起始值开始,每次递增2(保证相邻周期重叠2个月)
- 对每个起始总月份,生成连续4个总月份,再转换回yyyy-mm格式
- 用格式化字符串处理月份补零,同时处理12月的特殊取模情况
代码实现
# 定义日期范围:从2020-01到2021-04 start_year, start_month = 2020, 1 end_year, end_month = 2021, 4 # 转换为总月份数,方便跨年度计算 start_total = start_year * 12 + start_month end_total = end_year * 12 + end_month # 遍历每个周期的起始总月份,步长为2(每次跳2个月,重叠2个月) for current_start in range(start_total, end_total - 3 + 1, 2): period_dates = [] # 生成当前周期的4个连续月份 for offset in range(4): total_month = current_start + offset # 转换回年份和月份 year = total_month // 12 month = total_month % 12 # 处理12月的特殊情况:total_month%12=0时,实际是上一年的12月 if month == 0: year -= 1 month = 12 # 格式化yyyy-mm,月份补前导零 period_dates.append(f"{year}-{month:02d}") # 输出当前周期,用逗号分隔 print(', '.join(period_dates), end=', ')
代码说明
- 总月份数转换:把日期转成数字后,跨年度的计算变成简单的加减,无需单独判断跨年
- 步长设置:
range(..., 2)保证每个周期的起始月份比前一个晚2个月,自然实现2个月重叠 - 格式处理:
{month:02d}自动为月份补前导零,满足yyyy-mm的规范格式 - 12月处理:当
total_month%12=0时,说明是上一年的12月,需要调整年份和月份
输出示例
运行代码后会生成符合需求的序列:
2020-01, 2020-02, 2020-03, 2020-04, 2020-03, 2020-04, 2020-05, 2020-06, 2020-05, 2020-06, 2020-07, 2020-08, 2020-07, 2020-08, 2020-09, 2020-10, 2020-09, 2020-10, 2020-11, 2020-12, 2020-11, 2020-12, 2021-01, 2021-02, 2021-01, 2021-02, 2021-03, 2021-04,
内容的提问来源于stack exchange,提问作者Duster
相关产品推荐
相关产品推荐

