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
相关产品推荐
相关产品推荐

