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

Python对非规则月度数据线性插值:resample后插值全为NaN求解

解决pandas线性插值全NaN的问题,实现每月月初值的计算

我明白你作为Python新手在处理非规则时间序列插值时遇到的困惑——用resample('MS')加interpolate()得到全NaN确实让人摸不着头脑,咱们一步步拆解问题和解决方案:

问题根源

你遇到的全NaN结果,核心原因是**resample('MS')只生成了每月月初的时间戳,但你的原始数据点都不在这些时间点上**。这时候resample后的对象里所有位置都是NaN(没有任何已知值),interpolate()自然没有数据可以用来计算插值,最终返回全NaN。

正确实现步骤

要得到每月月初的线性插值,我们需要保留原始数据的时间点,把它们和目标月初点放在同一个时间序列里,再基于时间间隔进行插值。具体代码如下:

1. 先构造你的数据集(确保索引是datetime类型)

import pandas as pd

# 还原你的原始数据
data = pd.Series(
    [156, 216, 300, 184, 162, 91, 225, 245, 492, 485, 401, 215, 258],
    index=pd.to_datetime([
        '2017-04-17', '2017-05-09', '2017-06-11', '2017-07-29', '2017-08-31',
        '2017-09-24', '2017-10-15', '2017-11-03', '2017-12-26', '2018-01-26',
        '2018-02-18', '2018-03-09', '2018-04-30'
    ])
)

2. 生成目标月初时间序列

我们需要覆盖从数据起始月份到结束月份的所有月初:

# 获取起始和结束的月初日期
start_month = data.index.min().replace(day=1)
end_month = data.index.max().replace(day=1)
# 生成所有目标月初日期
target_dates = pd.date_range(start=start_month, end=end_month, freq='MS')

3. 合并原始数据与目标日期,执行时间插值

# 合并原始数据和目标日期,排序索引保证时间顺序
merged = pd.concat([data, pd.Series(index=target_dates)]).sort_index()

# 用`method='time'`基于时间间隔做线性插值(关键!)
interpolated = merged.interpolate(method='time')

# 提取出所有月初的插值结果
result = interpolated.loc[target_dates]
print(result)

输出结果示例

你会得到类似这样的结果(2017-04-01因为没有前置数据仍为NaN,其余都是合理的插值):

2017-04-01         NaN
2017-05-01    194.1818
2017-06-01    282.8571
2017-07-01    253.5000
2017-08-01    176.5385
2017-09-01    132.0000
2017-10-01    138.2727
2017-11-01    239.0769
2017-12-01    272.6154
2018-01-01    466.0769
2018-02-01    456.3077
2018-03-01    332.1538
2018-04-01    228.4286
Freq: MS, dtype: float64

关键细节说明

  • method='time':这个参数告诉pandas根据时间间隔来计算线性插值,而不是简单按行位置插值,这样能保证插值结果符合时间维度的变化趋势。
  • 合并原始数据与目标日期:这一步是为了让插值函数能找到每个月初点前后的已知数据点,从而计算出合理的中间值。

内容的提问来源于stack exchange,提问作者Dom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:07