如何判断列表中至少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))
代码说明
- 边界处理:当n≤1时,只要列表非空就满足;当列表长度不足n时,直接返回False,避免无效计算
- 排序:排序后可以确保双指针遍历的线性时间复杂度(O(n log n),主要来自排序)
- 滑动窗口:每个时间点最多被左右指针各访问一次,遍历过程是线性的
- 通用性:如果需要判断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
相关产品推荐
相关产品推荐

