如何生成从起始日期到结束日期、间隔7天的日期列表?代码调试求助
生成间隔7天的日期列表 & 代码问题排查
先说说你代码里的问题
你的代码之所以没有输出列表长度,是因为循环永远无法终止,程序一直卡在while循环里跑,根本到不了最后的print语句。具体问题出在这行:
tdate = sdate+timedelta(days=i)
你每次更新tdate的时候,都是从初始的sdate(1990-10-25)加上7天,结果tdate永远停在1990-11-01,永远小于adate(2022-12-31),循环条件adate > tdate永远为真,自然不会执行到后面的打印代码。
另外还有个小问题:你初始化的sdate和tdate是同一个日期,而且i的值固定为7,完全没起到递增的作用。
正确的实现方式
要生成从起始日期到结束日期、间隔7天的日期列表,核心是每次在当前日期的基础上加上7天,直到超过结束日期。这里给你两种实现方式:
方式一:用while循环(修复你的原代码)
from datetime import date, timedelta # 起始日期 sdate = date(1990, 10, 25) # 结束日期 edate = date(2022, 12, 31) # 间隔天数 interval = 7 rqd_dt = [] current_date = sdate while current_date <= edate: rqd_dt.append(current_date) # 关键:在当前日期基础上加间隔天数 current_date += timedelta(days=interval) print(len(rqd_dt)) # 也可以打印列表看看结果 # print(rqd_dt)
方式二:用生成器(更简洁高效)
如果数据量很大,用生成器可以节省内存:
from datetime import date, timedelta def generate_weekly_dates(start_date, end_date): current = start_date while current <= end_date: yield current current += timedelta(days=7) # 使用生成器 sdate = date(1990, 10, 25) edate = date(2022, 12, 31) weekly_dates = list(generate_weekly_dates(sdate, edate)) print(len(weekly_dates))
补充说明
- 注意循环条件用
current_date <= edate,这样结束日期如果刚好是间隔后的日期,也会被包含进去;如果不想包含结束日期,就改成current_date < edate。 - 两种方式都能正确生成你需要的日期列表,修复后的
while循环版本解决了原代码的死循环问题,能正常输出列表长度。
内容的提问来源于stack exchange,提问作者parth pratim
相关产品推荐
相关产品推荐

