为何resample后调用interpolate全为NaN,而mean却正常?
时间序列重采样后插值全NaN与均值保留数据的差异原因
问题背景
我有一个存在时间间隔的DataFrame,数据点比如2023-10-02 10:00、2023-10-02 10:10,随后跳至2023-10-03 10:00、2023-10-03 10:10。使用resample('20min')重采样时间序列后,调用interpolate(method="slinear", limit_direction="both",fill_value="extrapolate", order=2)填充缺失值,结果所有数据变为NaN;但使用mean()时却能保留部分有效数据。相关代码及输出如下:
原始数据示例
100 102 104 Date 10/2/2023 9:43 202.7250 202.9100 203.3800 10/2/2023 9:52 203.3000 203.2250 203.5100 ... 10/3/2023 8:53 204.2175 204.0425 204.3575
interpolate输出全NaN
rule_1='20min' df.index=pd.to_datetime(df.index) df_2=df.resample(rule=rule_1).interpolate(method="slinear", limit_direction="both",fill_value="extrapolate", order=2) df_2.tail(13) 100 102 104 Date 2023-10-03 04:40:00 NaN NaN NaN ... 2023-10-03 08:40:00 NaN NaN NaN
mean输出保留有效数据
rule_1='20min' df.index=pd.to_datetime(df.index) df_1=df.resample(rule=rule_1).mean() df_1.tail(13) 100 102 104 Date 2023-10-03 04:40:00 NaN NaN NaN ... 2023-10-03 08:40:00 204.18125 204.44125 204.69250
原因分析
- 分组内插值逻辑不适用:
resample('20min').interpolate()是先按20分钟窗口分组,再在每个分组内部执行插值。你的原始数据中,绝大多数窗口里只有0个或1个数据点——线性插值(slinear)需要至少两个点计算斜率,单个点无法生成插值结果,无数据点的窗口直接返回NaN,最终所有结果都是NaN。 - 均值计算的逻辑匹配场景:
resample('20min').mean()是对每个窗口内的现有数据取平均。只要窗口内存在原始数据(比如2023-10-03 08:40:00窗口包含10/3/2023 8:53的数据),就能算出有效均值;无数据的窗口才返回NaN,因此能保留部分有效数据。 - 参数冲突导致插值失效:你同时指定了
method="slinear"(一阶线性插值,无需order参数)和order=2(对应二次插值),这两个参数互斥,会干扰插值逻辑,进一步导致全NaN结果。
正确的插值做法
应该先生成完整的重采样时间框架,再对整个序列执行插值,而不是在分组内插值:
rule_1='20min' df.index=pd.to_datetime(df.index) # 生成完整的20分钟间隔时间序列,缺失值用NaN填充 df_resampled = df.resample(rule=rule_1).asfreq() # 对整个序列执行线性插值 df_filled = df_resampled.interpolate(method="slinear", limit_direction="both")
内容的提问来源于stack exchange,提问作者roudan
相关产品推荐
相关产品推荐

