如何为不规则采样率的传感器时间序列创建正确时间窗口?
不规则采样时间序列的滑动窗口修正方案
问题核心
你的代码直接按秒分组合并相邻组,未检测时间序列中的长间隔断点,导致跨1分27秒的两个时间片段被错误合并成一个窗口。
解决步骤
- 标记时间断点:计算相邻数据点的时间差,当差值超过设定阈值(比如1秒)时,标记为新连续序列的起点。
- 拆分连续子序列:基于断点将原始数据分割为多个无长间隔的子数据集。
- 独立生成窗口:对每个连续子序列单独创建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
相关产品推荐
相关产品推荐

