如何对含时间戳的Python二维坐标列表按时间间隔下采样
实现方案
前提说明
你的原始列表如果已经按X轴时间戳升序排列(绝大多数图表时序数据默认都是采集顺序排列),可以直接用O(n)时间复杂度的单次遍历方案完成降采样,不需要额外排序开销。
纯Python原生实现(零依赖、10万条以内数据最优)
核心逻辑是将时间戳按指定间隔取整得到所属区间,同一个区间只保留第一条记录:
# 示例输入 list1 = [[12345678, 12345678], [12345679, 12345679], [12346000, 12346000]] # 配置间隔,此处为5分钟,转换为秒 interval = 5 * 60 last_interval = None filtered_list = [] # 若原始列表未排序,先执行排序:list1.sort(key=lambda x: x[0]) for point in list1: ts = point[0] # 计算当前点所属的时间区间起始值 current_interval = ts // interval * interval # 遇到新的区间就保留该点 if current_interval != last_interval: filtered_list.append(point) last_interval = current_interval
该方案仅需要遍历列表一次,额外空间仅用于存储结果,是无第三方依赖场景下的最高效实现。
Pandas实现(10万条以上大数据量最优)
数据量较大时,pandas的向量化操作比原生Python循环效率高3~10倍:
import pandas as pd list1 = [[12345678, 12345678], [12345679, 12345679], [12346000, 12346000]] interval_seconds = 5 * 60 df = pd.DataFrame(list1, columns=["ts", "y"]) # 生成时间区间列,去重保留每个区间第一条记录 df["interval"] = df["ts"] // interval_seconds * interval_seconds res_df = df.drop_duplicates(subset="interval", keep="first") # 转换回二维列表格式 filtered_list = res_df[["ts", "y"]].values.tolist()
可选调整
如果需要保留每个区间的最后一条数据、或者区间内Y值的平均值/最大值等,只需要修改上述代码中区间取值的逻辑即可,核心的按间隔分桶逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Esh
相关产品推荐
相关产品推荐

