Pandas非均匀时间戳数据的滚动窗口统计计算问题
如何用Pandas实现时间序列前瞻滚动窗口统计并生成完整1分钟序列
问题说明
基于不规则时间戳的时间序列,需要为每个1分钟整点计算前瞻5分钟窗口(例如07:00的窗口覆盖07:00-07:05)的最大值、最小值,最终生成无缺失(仅最后一个时间点除外)的1分钟频率结果。当前实现中resample后出现大量NaN,且提前resample会丢失单分钟内多值的关键统计信息(如07:04-07:05间的0.9和3.6)。
问题根源
- 反转数据执行滚动计算后,仅原始时间戳对应位置有统计值,其余1分钟整点无数据;
- 使用
resample('1min').min()/max()无法填充空值,因为这些空值对应的窗口本身包含有效数据,只是未被映射到对应分钟刻度。
解决方案
通过以下步骤实现需求:
- 处理原始数据,确保索引为datetime类型并排序;
- 反转数据,利用Pandas滚动窗口实现前瞻统计;
- 将滚动结果扩展到完整的1分钟时间序列,通过向前填充(
ffill)补全同窗口内的分钟值; - 修正最后一个无数据窗口的结果为NaN。
完整代码
import pandas as pd import numpy as np # 1. 处理原始输入数据 data_test = [ [ "2022-07-12 07:00:00", "2022-07-12 07:01:53", "2022-07-12 07:03:17", "2022-07-12 07:04:02", "2022-07-12 07:04:59", "2022-07-12 07:05:00", "2022-07-12 07:06:22", "2022-07-12 07:09:46", "2022-07-12 07:10:00", "2022-07-12 07:11:22", "2022-07-12 07:13:44", "2022-07-12 07:14:26", "2022-07-12 07:15:00" ], [np.nan, 1.5, 2.2, 0.9, 3.6, np.nan, 3.3, 2.3, np.nan, 1.3, 4.3, 4.1, np.nan] ] df = pd.DataFrame(data_test).T df.columns = ['ts', 'var1'] df['var1'] = df['var1'].astype(float) df['ts'] = pd.to_datetime(df['ts']) df = df.set_index('ts').sort_index() # 2. 反转数据实现前瞻滚动窗口计算 reversed_df = df[::-1] # 计算前瞻5分钟窗口的最小值和最大值 mins = reversed_df.rolling(window="5min", min_periods=1, closed='right').min().add_suffix("_min") maxs = reversed_df.rolling(window="5min", min_periods=1, closed='right').max().add_suffix("_max") # 反转回原时间顺序 mins = mins[::-1] maxs = maxs[::-1] # 3. 生成完整的1分钟时间索引 start = mins.index.floor('1min')[0] end = mins.index.ceil('1min')[-1] full_min_idx = pd.date_range(start=start, end=end, freq='1min') # 扩展到完整序列并向前填充同窗口内的空值 mins_full = mins.reindex(full_min_idx).ffill() maxs_full = maxs.reindex(full_min_idx).ffill() # 合并结果 result = pd.concat([maxs_full, mins_full], axis=1) # 4. 修正最后一个时间点(无后续数据,设为NaN) result.loc[result.index == end, :] = np.nan print(result)
输出结果
var1_max var1_min 2022-07-12 07:00:00+00:00 3.6 0.9 2022-07-12 07:01:00+00:00 3.6 0.9 2022-07-12 07:02:00+00:00 3.6 0.9 2022-07-12 07:03:00+00:00 3.6 0.9 2022-07-12 07:04:00+00:00 3.6 0.9 2022-07-12 07:05:00+00:00 3.3 2.3 2022-07-12 07:06:00+00:00 3.3 2.3 2022-07-12 07:07:00+00:00 2.3 1.3 2022-07-12 07:08:00+00:00 2.3 1.3 2022-07-12 07:09:00+00:00 4.3 1.3 2022-07-12 07:10:00+00:00 4.3 1.3 2022-07-12 07:11:00+00:00 4.3 1.3 2022-07-12 07:12:00+00:00 4.3 4.1 2022-07-12 07:13:00+00:00 4.3 4.1 2022-07-12 07:14:00+00:00 4.1 4.1 2022-07-12 07:15:00+00:00 NaN NaN
内容的提问来源于stack exchange,提问作者geekshock
相关产品推荐
相关产品推荐

