Python中跨多年月按2天增量遍历日期的优化方案咨询
优雅实现Python按2天增量遍历跨年月日历日期
需求回顾
需要按2天增量循环遍历指定年月范围的日历日期(支持单月、多月、多年多月份),每次迭代调用main(client, start_date, end_date),确保无重复日期,原实现代码冗余繁琐,需优化。
原代码问题分析
- 硬编码月份天数:手动维护
days_in_month字典,未考虑闰年2月的29天情况,存在逻辑漏洞。 - 冗余分支逻辑:针对月份天数奇偶性拆分分支,重复编写
main调用和结果收集代码,维护成本高。 - 硬编码判断值:如
while end_day <=32这类不合理的硬编码,易引发日期越界错误。 - 低效的结果收集:通过循环逐个
append记录,不如直接用extend高效。
优化方案代码
from datetime import date, timedelta # 配置遍历范围 years = [2021, 2022] months = list(range(1, 13)) # 等价于[1,2,...,12] clients = ["client1", "client2"] combined_records = [] for client in clients: for target_year in years: for target_month in months: # 确定当月起始和结束日期 current_month_start = date(target_year, target_month, 1) # 计算下个月第一天,用于推导当月最后一天 if target_month == 12: next_month_start = date(target_year + 1, 1, 1) else: next_month_start = date(target_year, target_month + 1, 1) current_month_end = next_month_start - timedelta(days=1) current_start = current_month_start while current_start <= current_month_end: # 计算当前区间的结束日期,不超过当月最后一天 current_end = current_start + timedelta(days=1) if current_end > current_month_end: current_end = current_start # 当月最后一天单独作为一个区间 # 调用main函数并收集结果 list_of_records = main(client, current_start, current_end) combined_records.extend(list_of_records) # 按2天增量推进起始日期 current_start += timedelta(days=2) print(f"CLIENT COMPLETE: {client}")
优化亮点
- 自动适配日期规则:通过
next_month_start - timedelta(days=1)自动计算当月最后一天,完美处理闰年、不同月份天数差异,无需手动维护月份天数字典。 - 统一逻辑消除冗余:去掉奇偶月份分支,用一套逻辑处理所有月份,最后一天自动判断单独成组,代码简洁易维护。
- 安全的日期操作:直接使用
date对象和timedelta进行日期增量,避免手动计算日期数字导致的越界错误。 - 高效的结果收集:用
list.extend()替代循环append,减少内存操作,提升效率。
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

