含NaN的6分钟间隔数据转5分钟重采样及线性插值修正
含NaN的线性插值重采样问题修正
问题场景
我有一组6分钟间隔的瞬时测量数据,需要重采样为5分钟间隔,但处理后10:05时刻的column_b本应为NaN却出现了数值,需要修正。
原始数据代码
import pandas as pd import numpy as np df = pd.DataFrame(zip(['10:00','10:06','10:12','10:18','10:24'], [1, 2, 3, 0.5, 2.5], [0, np.nan, 5, 2.5, 10]), columns=['date','column_a','column_b']) df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True) df = df.set_index('date') print(df)
原始数据输出
column_a column_b date 2023-07-19 10:00:00 1.0 0.0 2023-07-19 10:06:00 2.0 NaN 2023-07-19 10:12:00 3.0 5.0 2023-07-19 10:18:00 0.5 2.5 2023-07-19 10:24:00 2.5 10.0
问题代码及异常结果
我原本用这段代码处理:
print(df.resample('1Min').interpolate(method='linear', limit=5).resample('5Min').asfreq())
得到的结果里,10:05的column_b不该有值:
column_a column_b date 2023-07-19 10:00:00 1.000000 0.000000 2023-07-19 10:05:00 1.833333 2.083333 <--- 这里应该是NaN 2023-07-19 10:10:00 2.666667 NaN 2023-07-19 10:15:00 1.750000 3.750000 2023-07-19 10:20:00 1.166667 5.000000
问题原因
原代码先按1分钟重采样再插值,会忽略10:06时刻column_b的NaN标记,直接从10:00的有效值向10:05插值,导致本应缺失的位置出现了不合理的数值。
解决方案
要保留原始缺失点的约束,需先保留原始NaN,再限定仅在前后都有有效值的区间内插值。修改后的代码如下:
# 1分钟重采样,保留原始NaN值 df_1min = df.resample('1Min').asfreq() # 仅在两个有效点之间插值,避免从单个有效点向外延伸 df_interpolated = df_1min.interpolate(method='linear', limit_area='inside') # 重采样为5分钟间隔 result = df_interpolated.resample('5Min').asfreq() print(result)
修正后输出
column_a column_b date 2023-07-19 10:00:00 1.000000 0.0 2023-07-19 10:05:00 1.833333 NaN 2023-07-19 10:10:00 2.666667 NaN 2023-07-19 10:15:00 1.750000 3.75 2023-07-19 10:20:00 1.166667 5.00
关键参数说明
limit_area='inside':限定插值仅在前后都有有效数据的区间内进行,不会跨越NaN点向外延伸- 先执行
resample('1Min').asfreq():确保原始数据中的NaN被保留在对应时间点,让插值逻辑识别到缺失约束
内容的提问来源于stack exchange,提问作者pyaj
相关产品推荐
相关产品推荐

