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

如何从已排序列表中提取时间间隔至少为x秒的datetime序列?

从已排序Datetime列表中提取满足时间间隔要求的序列

要求从已排序的datetime列表中提取一组值,满足以下条件:

  • 序列必须从列表第一个元素开始
  • 序列中任意相邻元素的时间差至少为x秒
  • 需包含列表中最后一个与序列倒数第二个元素时间差大于x秒的符合条件的值

示例(x=1秒)

输入:

import numpy as np
from datetime import datetime

Input_Arr = np.array([datetime(1981,1,1,0,0,0,40),
                      datetime(1981,1,1,0,0,0,80),
                      datetime(1981,1,1,0,0,1,20),
                      datetime(1981,1,1,0,0,1,50),
                      datetime(1981,1,1,0,0,2,00),
                      datetime(1981,1,1,0,0,2,70),
                      datetime(1981,1,1,0,0,3,10),
                      datetime(1981,1,1,0,0,3,40),
                      datetime(1981,1,1,0,0,4,20),
                      datetime(1981,1,1,0,0,5,00)])

输出:

Output_Arr = np.array([datetime(1981,1,1,0,0,0,40),
                       datetime(1981,1,1,0,0,1,50),
                       datetime(1981,1,1,0,0,2,70),
                       datetime(1981,1,1,0,0,4,20)])

现有可运行但效率较低的代码

原代码通过逐元素循环筛选,逻辑正确但处理大数据量时速度较慢:

from datetime import timedelta

Output_Arr = list()
time_delta = 1
for id, value in enumerate(Input_Arr):
    if id == 0:
        Output_Arr.append(value)
    else:
        if Output_Arr[-1] + timedelta(seconds=time_delta) < value:
            Output_Arr.append(value)

优化解决方案(适用于大数据量)

针对大数组场景,我们可以利用numpy的特性优化,减少循环开销,同时满足题目对最后一个元素的特殊要求:

import numpy as np
from datetime import datetime, timedelta

def filter_datetimes(arr, min_seconds):
    # 将datetime数组转换为精确到微秒的时间戳(浮点数,单位:秒)
    timestamps = arr.astype('datetime64[us]').astype(float) / 1e6
    
    # 初始化选中索引,第一个元素必选
    selected_indices = [0]
    last_selected_ts = timestamps[0]
    min_interval = min_seconds
    
    # 遍历筛选符合间隔要求的元素
    for idx in range(1, len(timestamps)):
        if timestamps[idx] - last_selected_ts > min_interval:
            selected_indices.append(idx)
            last_selected_ts = timestamps[idx]
    
    # 检查最后一个元素是否符合与倒数第二个选中元素的间隔要求
    if len(selected_indices) >= 2:
        last_candidate_idx = len(arr) - 1
        if timestamps[last_candidate_idx] - timestamps[selected_indices[-2]] > min_interval:
            selected_indices[-1] = last_candidate_idx
    
    # 返回筛选后的数组
    return arr[selected_indices]

# 测试示例
time_delta = 1
Output_Arr = filter_datetimes(Input_Arr, time_delta)
print(Output_Arr)

优化点说明:

  1. 时间戳转换:将datetime转换为微秒级时间戳,计算时间差更高效
  2. 索引记录:仅记录符合条件的元素索引,最后一次性提取,减少数组操作开销
  3. 最后元素处理:额外检查列表最后一个元素,确保满足与序列倒数第二个元素的间隔要求时被纳入

内容的提问来源于stack exchange,提问作者Sascha Lüthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:50:32