You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python筛选未来10天日期并合并连续日期代码异常求助

问题排查与修正代码

先梳理你的代码存在的几个核心问题:

1. 缩进语法错误

start_date = None之后的end_date、list_upcoming定义以及后续循环都存在缩进层级错误,Python对缩进敏感,这会直接导致代码运行报错。

2. 日期比较的时分秒干扰

datetime.datetime.now()会包含时分秒信息,比如当前时间是2024-10-05 14:30:00,而你解析后的日期是2024-10-05 00:00:00,此时date >= today会判定为False,导致当天的日期被错误排除。应该把today和future_date都转换为date类型,只保留年月日部分。

3. 连续日期合并逻辑缺陷

  • 遍历第一个日期时,仅设置了end_date,未同步初始化start_date,导致后续逻辑混乱
  • 遇到不连续日期时,只添加了单个start_date,未正确处理之前的连续区间(如果起始和结束日期不同)
  • 最后收尾时,强制用-连接所有剩余日期,无法区分单个日期和连续区间

修正后的代码

from datetime import datetime, timedelta

def process_dates(data_list):
    """
    筛选未来10天日期的逻辑
    -> 创建10天的timedelta,计算未来日期
    -> 检查未来几天内是否有公共假日
    """
    list_upcoming_raw = []
    ten_days = timedelta(days=10)
    # 转换为date类型,消除时分秒干扰
    today = datetime.now().date()
    future_date = today + ten_days

    for date_str in data_list:
        date = datetime.strptime(date_str, '%y%m%d').date()
        if today <= date <= future_date:
            list_upcoming_raw.append(date)
    list_upcoming_raw.sort()

    list_upcoming = []
    if not list_upcoming_raw:
        return list_upcoming
    
    # 初始化连续区间的起始与结束日期
    start_date = list_upcoming_raw[0]
    end_date = list_upcoming_raw[0]

    for date in list_upcoming_raw[1:]:
        if date == end_date + timedelta(days=1):
            # 日期连续,更新结束日期
            end_date = date
        else:
            # 日期不连续,添加之前的区间
            if start_date == end_date:
                list_upcoming.append(start_date.strftime('%d.%m.%Y'))
            else:
                list_upcoming.append(f"{start_date.strftime('%d.%m.%Y')}-{end_date.strftime('%d.%m.%Y')}")
            # 重置区间起始与结束为当前日期
            start_date = date
            end_date = date
    
    # 处理最后一组区间
    if start_date == end_date:
        list_upcoming.append(start_date.strftime('%d.%m.%Y'))
    else:
        list_upcoming.append(f"{start_date.strftime('%d.%m.%Y')}-{end_date.strftime('%d.%m.%Y')}")
    
    return list_upcoming

# 测试示例数据
data_list = [
    "231002", "231003", "231004", "231005", "231006",
    "231009", "231010", "231011", "231012", "231013",
    "231030", "231031", "240223", "240328", "240329",
    "240401", "240402", "240403", "240404", "240405",
    "240501", "240508", "240509", "240510", "240520",
    "240521", "240620", "240621", "240624", "240625",
    "240626", "240312", "240313", "240314", "240315"
]

print(process_dates(data_list))

关键修改说明

  1. 日期类型统一:将today和future_date转换为date类型,避免时分秒对日期比较的干扰
  2. 缩进修正:调整变量定义和循环的缩进层级,确保Python语法正确
  3. 区间初始化优化:直接用第一个日期初始化start_date和end_date,逻辑更直观
  4. 区间合并逻辑完善:每次遇到不连续日期时,根据起始和结束日期是否相同,决定添加单个日期还是区间;最后单独处理剩余的区间
  5. 空列表判断:添加空列表校验,避免索引越界错误

内容的提问来源于stack exchange,提问作者zlElo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:53:24