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

如何判断列表中至少N个datetime对象落在24小时时间范围内?

判断Datetime列表中是否存在n个时间点落在指定时长区间内

核心思路

最高效的实现方式是排序+滑动窗口(双指针):

  • 先对时间列表排序,确保时间按先后顺序排列
  • 用左指针固定区间起始点,右指针向右扩展,找到第一个超出「起始点+目标时长」的位置
  • 计算区间内的时间点数量,只要有任意一个区间满足数量≥n,就返回True

代码实现(以24小时区间为例)

from datetime import datetime, timedelta

def has_n_in_interval(arr: list[datetime], n: int, interval: timedelta) -> bool:
    # 边界情况处理
    if n <= 1:
        return True
    if len(arr) < n:
        return False
    
    # 对时间列表排序
    sorted_arr = sorted(arr)
    
    j = 0
    for i in range(len(sorted_arr)):
        # 扩展右指针,直到超出当前区间范围
        while j < len(sorted_arr) and sorted_arr[j] <= sorted_arr[i] + interval:
            j += 1
        # 检查当前区间内的时间点数量是否达标
        if j - i >= n:
            return True
    return False

# 针对24小时区间的便捷调用
def has_n_in_24h(arr: list[datetime], n: int) -> bool:
    return has_n_in_interval(arr, n, timedelta(hours=24))

代码说明

  1. 边界处理:当n≤1时,只要列表非空就满足;当列表长度不足n时,直接返回False,避免无效计算
  2. 排序:排序后可以确保双指针遍历的线性时间复杂度(O(n log n),主要来自排序)
  3. 滑动窗口:每个时间点最多被左右指针各访问一次,遍历过程是线性的
  4. 通用性:如果需要判断15分钟这类其他区间,只需调用has_n_in_interval并传入对应的timedelta(minutes=15)即可

测试示例

# 测试用时间列表
arr = [
    datetime(2023, 9, 1, 4, 3),
    datetime(2023, 9, 1, 2, 15),
    datetime(2023, 9, 1, 6, 45),
    datetime(2023, 9, 2, 3, 0),
    datetime(2023, 9, 2, 5, 0)
]

# 检查是否有4个时间点落在24小时内
print(has_n_in_24h(arr, 4))  # 输出: True
# 检查是否有5个时间点落在24小时内
print(has_n_in_24h(arr, 5))  # 输出: False

# 检查是否有3个时间点落在15分钟内
print(has_n_in_interval(arr, 3, timedelta(minutes=15)))  # 输出: False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:47:11