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

如何快速移除Python日期列表中连续3天及以上的日期?

移除datetime.date列表中连续3天及以上日期区间的最快实现

我来帮你搞定这个问题!你手里有一个datetime.date类型的日期列表,目标是移除所有属于连续3天及以上的日期区间,只保留那些孤立的、或者连续不足3天的日期。

原输入列表

import datetime
dates = [
    datetime.date(2018, 7, 2), datetime.date(2018, 7, 5), datetime.date(2018, 7, 7),
    datetime.date(2018, 7, 15), datetime.date(2018, 7, 16), datetime.date(2018, 7, 17),
    datetime.date(2018, 7, 29), datetime.date(2018, 8, 13), datetime.date(2018, 8, 27),
    datetime.date(2018, 9, 19), datetime.date(2018, 10, 25), datetime.date(2018, 11, 9),
    datetime.date(2018, 12, 21), datetime.date(2018, 12, 22), datetime.date(2018, 12, 23),
    datetime.date(2018, 12, 24), datetime.date(2018, 12, 25), datetime.date(2019, 1, 2),
    datetime.date(2019, 1, 3), datetime.date(2019, 1, 4), datetime.date(2019, 1, 5),
    datetime.date(2019, 1, 6), datetime.date(2019, 1, 7), datetime.date(2019, 1, 8),
    datetime.date(2019, 2, 27), datetime.date(2019, 2, 28), datetime.date(2019, 3, 1),
    datetime.date(2019, 3, 2), datetime.date(2019, 3, 3), datetime.date(2019, 3, 6),
    datetime.date(2019, 3, 11), datetime.date(2019, 3, 12), datetime.date(2019, 3, 13),
    datetime.date(2019, 3, 14), datetime.date(2019, 3, 16), datetime.date(2019, 3, 25),
    datetime.date(2019, 3, 27), datetime.date(2019, 3, 29), datetime.date(2019, 3, 30),
    datetime.date(2019, 4, 8)
]

预期结果

[
    datetime.date(2018, 7, 2), datetime.date(2018, 7, 5), datetime.date(2018, 7, 7),
    datetime.date(2018, 7, 29), datetime.date(2018, 8, 13), datetime.date(2018, 8, 27),
    datetime.date(2018, 9, 19), datetime.date(2018, 10, 25), datetime.date(2018, 11, 9),
    datetime.date(2019, 3, 6), datetime.date(2019, 3, 16), datetime.date(2019, 3, 25),
    datetime.date(2019, 3, 27), datetime.date(2019, 3, 29), datetime.date(2019, 3, 30),
    datetime.date(2019, 4, 8)
]

最快实现方案

要实现这个需求,最高效的方式是一次遍历+区间跟踪,时间复杂度为O(n log n)(如果原列表无序,排序占主导;如果原列表已经有序,就是O(n)),这是理论上的最优复杂度,因为至少需要遍历所有元素一次。

代码实现如下:

import datetime

def remove_long_contiguous_dates(dates):
    if not dates:
        return []
    
    # 先确保日期有序(兼容原列表无序的情况)
    sorted_dates = sorted(dates)
    result = []
    # 初始化当前连续区间的起始日期和长度
    current_start = sorted_dates[0]
    current_length = 1
    
    for date in sorted_dates[1:]:
        # 判断当前日期是否属于当前连续区间
        expected_next_date = current_start + datetime.timedelta(days=current_length)
        if date == expected_next_date:
            current_length += 1
        else:
            # 当前区间中断,判断是否保留该区间的日期
            if current_length < 3:
                # 截取当前区间的所有日期加入结果
                start_idx = sorted_dates.index(current_start)
                result.extend(sorted_dates[start_idx:start_idx + current_length])
            # 重置区间跟踪变量
            current_start = date
            current_length = 1
    
    # 处理最后一个未完成的区间
    if current_length < 3:
        start_idx = sorted_dates.index(current_start)
        result.extend(sorted_dates[start_idx:start_idx + current_length])
    
    return result

# 测试调用
filtered_dates = remove_long_contiguous_dates(dates)
print(filtered_dates)

代码说明

  1. 排序处理:先对日期列表排序,确保我们能按时间顺序遍历,即使原列表是无序的也能正常工作。
  2. 区间跟踪:遍历过程中记录当前连续区间的起始日期和长度,每次遇到不连续的日期时,就判断当前区间的长度:
    • 如果长度小于3,就把区间内的所有日期加入结果列表;
    • 如果长度大于等于3,就直接跳过这个区间。
  3. 收尾处理:遍历结束后,别忘了处理最后一个未完成的连续区间。

这个方法逻辑清晰,执行效率高,完全能满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:48:19