You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:37:08