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

寻找Scipy interp1d替代方案:Pandas日期加权插值需求

替代Scipy interp1d的日期加权插值方案(Pandas DataFrame场景)

Scipy的interp1d已被官方标记为弃用,后续版本会移除。如果你在生产环境里用它实现基于日期距离的加权插值(针对列名为日期的Pandas DataFrame,在两列间插入新日期列,结果随日期距离加权,靠近左列则更贴近左列值),可以用以下两种替代方案:

方案一:用Pandas内置时间序列插值

Pandas原生支持时间索引的线性插值,完全匹配"按日期距离加权"的需求(线性插值本质就是按时间间隔分配权重)。操作步骤如下:

  1. 将DataFrame的日期列名转换为datetime类型
  2. 转置DataFrame,把日期设为索引
  3. 插入目标日期并调用interpolate(method='time')完成插值
  4. 转置回原结构得到结果
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:45:10