寻找Scipy interp1d替代方案:Pandas日期加权插值需求
替代Scipy interp1d的日期加权插值方案(Pandas DataFrame场景)
Scipy的interp1d已被官方标记为弃用,后续版本会移除。如果你在生产环境里用它实现基于日期距离的加权插值(针对列名为日期的Pandas DataFrame,在两列间插入新日期列,结果随日期距离加权,靠近左列则更贴近左列值),可以用以下两种替代方案:
方案一:用Pandas内置时间序列插值
Pandas原生支持时间索引的线性插值,完全匹配"按日期距离加权"的需求(线性插值本质就是按时间间隔分配权重)。操作步骤如下:
- 将DataFrame的日期列名转换为
datetime类型 - 转置DataFrame,把日期设为索引
- 插入目标日期并调用
interpolate(method='time')完成插值 - 转置回原结构得到结果
import pandas as pd import datetime # 构造测试数据 df = pd.DataFrame( [[10, 20], [30, 40]], columns=['2023-01-01', '2023-01-03'] ) # 列名转为datetime类型 df.columns = pd.to_datetime(df.columns) # 转置后设置日期为索引,插入目标日期 df_transposed = df.T df_transposed.index.name = 'date' target_date = datetime.datetime(2023, 1, 2) df_transposed = df_transposed.reindex(df_transposed.index.union([target_date])) # 按时间插值 df_transposed_interpolated = df_transposed.interpolate(method='time') # 转回原结构 df_result = df_transposed_interpolated.T print(df_result)
方案二:无第三方依赖的手动加权实现
如果需要完全脱离Scipy依赖,甚至可以手动计算加权系数实现插值。核心逻辑是根据目标日期与左右相邻日期的间隔占比分配权重:
- 左权重 = (右日期 - 目标日期)的天数 / (右日期 - 左日期)的总天数
- 右权重 = (目标日期 - 左日期)的天数 / (右日期 - 左日期)的总天数
- 插值结果 = 左列值 × 左权重 + 右列值 × 右权重
import pandas as pd import datetime def manual_date_weighted_interpolate(df, target_date): # 转换列名为datetime类型 cols = pd.to_datetime(df.columns) # 定位目标日期的左右相邻列 left_col = cols[cols < target_date].max() right_col = cols[cols > target_date].min() # 计算时间间隔(天数) delta_total = (right_col - left_col).days delta_target_left = (target_date - left_col).days # 计算加权系数 weight_left = (delta_total - delta_target_left) / delta_total weight_right = delta_target_left / delta_total # 计算插值列 interpolated_col = df[left_col] * weight_left + df[right_col] * weight_right # 插入到DataFrame的对应位置 insert_pos = df.columns.get_loc(right_col) df.insert(insert_pos, target_date, interpolated_col) return df # 测试数据 df = pd.DataFrame( [[10, 20], [30, 40]], columns=['2023-01-01', '2023-01-03'] ) target_date = datetime.datetime(2023, 1, 2) df_result = manual_date_weighted_interpolate(df, target_date) print(df_result)
两种方案的测试结果一致:目标日期列的值为[15, 35],符合"间隔1天,左右权重各0.5"的预期;若目标日期更靠近左列(如2023-01-01 12:00),左权重会自动提高,结果更贴近左列值。
内容的提问来源于stack exchange,提问作者gridvision
相关产品推荐
相关产品推荐

