为何scipy.interpolate插值后散点图仍有空缺?如何输出插值值?
解决scipy线性插值无效的问题
你的代码没生效是因为原始数据node_6中存在NaN值,interp1d默认不会自动忽略输入里的缺失值,导致插值函数在对应位置仍返回NaN。解决步骤如下:
修正后的代码
import numpy as np import matplotlib.pyplot as plt import scipy.interpolate as interpolate # 提取目标数据列 node_6 = prob_1.iloc[:,1] t = np.arange(5, 1441, 5) # 1. 过滤掉含NaN的无效数据对 valid_mask = ~np.isnan(node_6) t_valid = t[valid_mask] node_6_valid = node_6[valid_mask] # 2. 用有效数据创建线性插值函数 f6 = interpolate.interp1d(t_valid, node_6_valid, kind='linear', fill_value="extrapolate") # 注:fill_value="extrapolate"用于补全有效数据范围外的空缺,本次xli在5-1440范围内,可省略 # 3. 生成插值后的数值 xli = np.linspace(5, 1440, 10000) y_6 = f6(xli) # 4. 输出插值后的数值(示例:打印前10组,或保存为CSV) print("插值后前10组数值对:") print(np.column_stack((xli[:10], y_6[:10]))) # 保存为文件:np.savetxt("interpolated_data.csv", np.column_stack((xli, y_6)), delimiter=",", header="time,value", comments="") # 5. 绘制散点图 plt.scatter(xli, y_6, c='r', s=1) plt.xlabel("时间(分钟)") plt.ylabel("插值后数值") plt.show()
关键说明
- 过滤无效数据:通过
~np.isnan(node_6)生成有效数据掩码,仅保留有数值的时间点和对应数据,这是插值生效的核心前提。 - 插值函数参数:如果有效数据覆盖了5-1440分钟的全范围,
fill_value参数可省略;若首尾存在缺失,fill_value="extrapolate"会用线性外插补全空缺。 - 结果输出:可通过
np.savetxt将插值后的时间-数值对保存为CSV文件,方便后续使用。
内容的提问来源于stack exchange,提问作者Tom Hart
相关产品推荐
相关产品推荐

