Python实现Kairos的GAPS算子:采样窗口有数据时勿生成NaN
解决Kairos GAPS算子的Pandas实现问题
首先明确核心需求:按指定采样频率(比如1小时)划分时间窗口,仅当窗口内完全没有数据点时,才在窗口起始位置插入NaN;若窗口内已有数据,则不生成该窗口的NaN点。你的问题出在当前代码可能直接生成了全量采样序列并合并,导致即使窗口有数据也保留了窗口起始的空值。
具体解决方案步骤
- 规整原始数据:确保时间列是datetime类型并设为索引,完成排序。
- 生成覆盖数据时间范围的所有采样窗口起始时间。
- 筛选出完全没有数据的空窗口。
- 仅为空窗口生成NaN数据,再与原始数据合并排序。
可运行代码示例
import pandas as pd import numpy as np # 原始数据 raw_data = pd.DataFrame({ 'timestamp': ['2023-07-20 01:40:00', '2023-07-20 01:50:10'], 'value': [20, 25] }) # 数据预处理:转datetime格式、设置索引、排序 raw_data['timestamp'] = pd.to_datetime(raw_data['timestamp']) data = raw_data.set_index('timestamp').sort_index() # 定义采样频率(此处为1小时,可按需修改) sample_freq = '1H' # 生成覆盖数据时间范围的所有采样窗口起始点 min_window = data.index.min().floor(sample_freq) max_window = data.index.max().floor(sample_freq) all_windows = pd.date_range(start=min_window, end=max_window, freq=sample_freq) # 标记已有数据的窗口 data['window_start'] = data.index.floor(sample_freq) existing_windows = data['window_start'].unique() # 筛选出无数据的空窗口 empty_windows = all_windows[~all_windows.isin(existing_windows)] # 为空窗口生成NaN数据 nan_records = pd.DataFrame({'value': np.nan}, index=empty_windows) # 合并原始数据与NaN数据,整理最终结果 final_result = pd.concat([data.drop('window_start', axis=1), nan_records]) final_result = final_result.sort_index().reset_index().rename(columns={'index': 'timestamp'}) print(final_result)
代码说明
- 这段代码只会在完全没有数据的采样窗口插入NaN,比如若数据中没有02:00-03:00窗口的任何数据,才会生成
2023-07-20 02:00:00的NaN点。 - 对于已有数据的窗口(比如01:00-02:00),只会保留原始的
01:40:00和01:50:10数据点,不会额外生成窗口起始的NaN。
内容的提问来源于stack exchange,提问作者nkstack
相关产品推荐
相关产品推荐

