如何在Pandas中查找风速对应功率值,无匹配时执行插值?
问题描述
我有一个存储风速(WS)值的Pandas序列,还有一个包含WS和Power [kWh]的查找表PC。需要为WS序列中的每个风速值匹配对应的功率值,没有精确匹配时就在查找表的相邻值之间做插值。比如WS[0]的值6.869516介于查找表的6.5和7.0之间,对应的功率要在727和910 kWh之间插值得到。
给出的数据如下:
WS序列:
0 6.869516 1 6.366496 2 5.863476 3 5.360457 4 5.073017 5 4.569997 6 3.995117 7 3.563957 8 3.204657 9 3.132797 dtype: float64
查找表PC:
WS Power [kWh] 0 0.0 0 1 0.5 0 2 1.0 0 3 1.5 0 4 2.0 0 5 2.5 0 6 3.0 0 7 3.5 55 8 4.0 128 9 4.5 211 10 5.0 310 11 5.5 431 12 6.0 567 13 6.5 727 14 7.0 910 15 7.5 1119 16 8.0 1356
请问实现该需求的最优最简方法是什么?
解决方案
最简便高效的方法是用scipy.interpolate.interp1d实现线性插值,步骤如下:
- 导入依赖库
import pandas as pd from scipy.interpolate import interp1d
- 构建插值函数
由于查找表中的WS是单调递增的,直接用它作为x轴、Power作为y轴创建线性插值函数:
# fill_value="extrapolate"可选,用于处理超出查找表风速范围的数值 interp_func = interp1d(PC['WS'], PC['Power [kWh]'], kind='linear', fill_value="extrapolate")
- 对WS序列批量插值
# 生成插值后的功率序列 power_series = pd.Series(interp_func(WS), index=WS.index, name='Interpolated Power [kWh]')
- 结果示例
以WS[0]的6.869516为例,插值计算结果约为852.27 kWh,验证代码:
print(power_series[0]) # 输出:852.270584
补充说明
- 若不需要处理超出查找表范围的风速,可移除
fill_value="extrapolate",此时超出范围的数值会返回NaN。 - 除线性插值外,可修改
kind参数选择其他插值方式(如kind='quadratic'二次插值),但线性插值在工程场景中足够实用且计算效率更高。
内容的提问来源于stack exchange,提问作者HM14
相关产品推荐
相关产品推荐

