Pandas下采样非均匀时间序列至固定6小时点遇异常求助
解决非均匀时间序列下采样到固定6小时时间点的问题
问题背景
需要将非均匀亚小时间隔的数据集下采样为6小时频率,固定时间点为00:00、06:00、12:00、18:00,规则如下:
- 若目标时间点存在原始数据,直接保留该数据;
- 若目标时间点无原始数据,取最近的前序原始数据,不做额外处理。
使用data.resample('6H').last()时出现异常:从2022-10-31开始,18:00的采样结果取到的是17:30的数据,而非预期的18:00数据点。
问题原因
默认的resample('6H')会以数据集的第一个时间点(此处为2022-10-29 18:00)作为区间起始点划分6小时窗口,导致窗口标签与需求的固定时间点错位:
- 2022-10-31 12:00~18:00的窗口包含到17:30的数据,
last()会取该窗口的最后一条数据(17:30); - 2022-10-31 18:00的原始数据被划分到18:00~次日00:00的窗口中,无法作为18:00时间点的采样结果。
解决方案
方法一:指定resample的origin参数对齐固定时间点
通过origin参数强制将6小时窗口的起始点对齐到每天的00:00,让窗口标签完全匹配需求的固定时间点,last()即可正确取到每个窗口内的最后一条数据(包括目标时间点本身)。
# 对齐到每天的起始时间(00:00) resampled_data = data.resample('6H', origin='start_day').last() # 或直接指定明确的起始时间,确保完全匹配 resampled_data = data.resample('6H', origin='2022-10-29 00:00:00').last()
方法二:生成目标时间序列后用前向填充
直接生成符合要求的固定时间点序列,再用reindex结合前向填充(method='ffill')实现需求,这种方式更直观,完全匹配规则逻辑:
# 生成目标时间序列:从数据最早日期的00:00到最晚日期的00:00,间隔6小时 start_time = data.index.min().floor('D') end_time = data.index.max().ceil('D') target_time_points = pd.date_range(start=start_time, end=end_time, freq='6H') # 前向填充:存在数据则保留,无数据取最近前序数据 resampled_data = data.reindex(target_time_points, method='ffill')
结果验证
两种方法均能得到符合预期的结果,例如2022-10-31 18:00的采样值会是原始数据中的8790.3,而非17:30的8790.4。
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

