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

如何为不规则采样率的传感器时间序列创建正确时间窗口?

不规则采样时间序列的滑动窗口修正方案

问题核心

你的代码直接按秒分组合并相邻组,未检测时间序列中的长间隔断点,导致跨1分27秒的两个时间片段被错误合并成一个窗口。

解决步骤

  1. 标记时间断点:计算相邻数据点的时间差,当差值超过设定阈值(比如1秒)时,标记为新连续序列的起点。
  2. 拆分连续子序列:基于断点将原始数据分割为多个无长间隔的子数据集。
  3. 独立生成窗口:对每个连续子序列单独创建2秒滑动窗口,避免跨间隔合并。

修正代码

import pandas as pd

def create_windows(df, window_duration=2, gap_threshold=1):
    # 转换Timestamp为datetime类型
    df['Timestamp'] = pd.to_datetime(df['Timestamp'])
    # 计算相邻时间差(单位:秒)
    df['time_gap'] = df['Timestamp'].diff().dt.total_seconds()
    # 标记断点:首行或时间差超过阈值的行
    df['is_break'] = df['time_gap'].isna() | (df['time_gap'] > gap_threshold)
    # 生成连续序列分组ID
    df['sequence_id'] = df['is_break'].cumsum()
    
    result_windows = []
    # 遍历每个连续序列
    for seq_id in df['sequence_id'].unique():
        sub_df = df[df['sequence_id'] == seq_id].drop(['time_gap', 'is_break', 'sequence_id'], axis=1)
        # 设置时间戳为索引,使用时间滑动窗口
        sub_df = sub_df.set_index('Timestamp')
        # 生成2秒滑动窗口,过滤掉有效时长不足的窗口
        for window in sub_df.rolling(window=f'{window_duration}s'):
            if len(window) >= 1 and (window.index.max() - window.index.min()) >= pd.Timedelta(seconds=window_duration-1):
                result_windows.append(window.reset_index())
    
    return result_windows

关键细节

  • 断点检测:用diff()计算时间差,cumsum()生成序列ID,自动拆分长间隔前后的数据。
  • 时间窗口生成:使用rolling的时间窗口而非按秒分组,更贴合不规则采样的场景,确保窗口内的时间连续。
  • 窗口过滤:通过时间差判断窗口是否达到有效时长,避免生成不完整的窗口。

效果验证

针对你的示例数据,修正后的代码会生成两个独立的窗口集合:

  • 第一组:包含08:55:31到08:55:32的2秒窗口
  • 第二组:包含08:56:59到08:57:00的2秒窗口
    彻底避免了跨长间隔的错误合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:57:49