如何从已排序列表中提取时间间隔至少为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)
优化点说明:
- 时间戳转换:将datetime转换为微秒级时间戳,计算时间差更高效
- 索引记录:仅记录符合条件的元素索引,最后一次性提取,减少数组操作开销
- 最后元素处理:额外检查列表最后一个元素,确保满足与序列倒数第二个元素的间隔要求时被纳入
内容的提问来源于stack exchange,提问作者Sascha Lüthi
相关产品推荐
相关产品推荐

