如何限制Python列表最后一项的日期不超过指定结束日期
问题:生成日期段列表时限制结束日期不超过设定值
需求:基于给定起止日期,创建按30天递增的日期段列表,要求最后一段的结束日期不得超过设定的结束日期,但当前代码生成的结果超出了结束日期,需修正。
原代码
from datetime import timedelta, date start_date = date(2021,1,1) end_date = date(2021,6,30) n = 30 next_date = start_date res = [] while start_date < end_date: next_date = (start_date + timedelta(n)) next_date_str = next_date.strftime('%Y-%m-%d') var = start_date.strftime('%Y-%m-%d')+'#'+next_date_str res.append(var) start_date = next_date + timedelta(1) print(res)
实际输出
['2021-01-01#2021-01-31', '2021-02-01#2021-03-03', '2021-03-04#2021-04-03', '2021-04-04#2021-05-04', '2021-05-05#2021-06-04', '2021-06-05#2021-07-05']
期望输出
['2021-01-01#2021-01-31', '2021-02-01#2021-03-03', '2021-03-04#2021-04-03', '2021-04-04#2021-05-04', '2021-05-05#2021-06-04', '2021-06-05#2021-06-30']
修正方案
核心是每次计算结束日期时,取30天后的日期和设定的结束日期中的较小值,避免超出范围;同时调整循环逻辑,确保最后一段生成后及时终止循环。
修正后的代码:
from datetime import timedelta, date start_date = date(2021,1,1) end_date = date(2021,6,30) n = 30 res = [] current_start = start_date while current_start <= end_date: # 计算当前段的结束日期,取30天后和end_date的较小值 current_end = min(current_start + timedelta(days=n), end_date) # 生成日期段字符串 date_segment = f"{current_start.strftime('%Y-%m-%d')}#{current_end.strftime('%Y-%m-%d')}" res.append(date_segment) # 如果已经到了结束日期,终止循环 if current_end == end_date: break # 下一段的起始日期是当前结束日期+1天 current_start = current_end + timedelta(days=1) print(res)
修正说明
- 替换原循环中的
start_date为current_start,避免修改原始变量,逻辑更清晰; - 用
min()函数限制current_end的最大值为end_date,确保不会超出设定范围; - 添加判断:当
current_end等于end_date时直接终止循环,避免无效的后续计算; - 循环条件改为
current_start <= end_date,确保最后一段(起始日期在end_date之前或当天)能被正确生成。
内容的提问来源于stack exchange,提问作者vvazza
相关产品推荐
相关产品推荐

