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

Python实现两DataFrame列间插值 解决time列非线性递增问题

两个DataFrame指定列线性插值计算方案

现有测试数据

  • dataframe1结构与样例数据:
+-------+----------+--------------+---------------+-------+-----------+
| index |   time   | displacement | normal_stress | speed | amplitude |
+-------+----------+--------------+---------------+-------+-----------+
|  1227 | 1412.341 |     0.232728 |     94.508177 |   0.1 |         2 |
|  1228 | 1413.389 |     0.234591 |     98.358851 |   0.1 |         2 |
|  1229 | 1414.450 |     0.235065 |    104.554040 |   0.1 |         2 |
+-------+----------+--------------+---------------+-------+-----------+
  • dataframe2初始结构、取值与dataframe1完全一致,已手动将amplitude列所有值修改为10000,修改后数据:
+-------+----------+--------------+---------------+-------+-----------+
| index |   time   | displacement | normal_stress | speed | amplitude |
+-------+----------+--------------+---------------+-------+-----------+
|  1227 | 1412.341 |     0.232728 |     94.508177 |   0.1 |     10000 |
|  1228 | 1413.389 |     0.234591 |     98.358851 |   0.1 |     10000 |
|  1229 | 1414.450 |     0.235065 |    104.554040 |   0.1 |     10000 |
+-------+----------+--------------+---------------+-------+-----------+

需求说明

计算dataframe2中逐行线性递增的对应time列取值,预期输出样例如下:

+-------+----------+--------------+---------------+-------+-----------+
| index |   time   | displacement | normal_stress | speed | amplitude |
+-------+----------+--------------+---------------+-------+-----------+
|  1227 | 76566.341 |     0.232728 |     94.508177 |   0.1 |       10000 |
|  1228 | 76567.389 |     0.234591 |     98.358851 |   0.1 |     10000 |
|  1229 | 76569.450 |     0.235065 |    104.554040 |   0.1 |     10000 |
+-------+----------+--------------+---------------+-------+-----------+

原有代码问题

之前使用np.interp的实现存在三个核心错误:

  1. np.interp参数顺序错误:函数签名为np.interp(x, xp, fp),其中x是待插值的自变量值,xp是已知点的自变量序列(必须单调递增),fp是已知点对应的因变量序列,原有代码传入的参数完全颠倒了自变量和因变量的对应关系。
  2. 传入的xp序列(即dataframe1的amplitude列)所有值均为常数2,不满足np.interp要求的自变量序列单调不重复的前提,无法计算插值结果。
  3. 代码中使用的time_2变量未定义,会直接触发运行错误。

原有错误代码如下:

time_1 = dataframe1['time'] 
amp1 = dataframe1['amplitude'] 
amp2 = dataframe2['amplitude'] 
dataframe2['time'] = np.interp(time_1, amp1, time_2)

正确实现方案

从预期结果可以看出,time和amplitude为线性映射关系,且行与行之间的原始时间间隔、每行时间的小数偏移量保持不变,只需要根据amplitude的变化量计算固定偏移量,逐行叠加即可。
可直接运行的代码如下:

import pandas as pd
import numpy as np

# 定义映射基准:amplitude=2时第一行time为1412.341,amplitude=10000时第一行time为76566.341
base_amp_low = 2
base_time_low = 1412.341
base_amp_high = 10000
base_time_high = 76566.341

# 计算单位amplitude变化对应的time增量
time_delta_per_amp = (base_time_high - base_time_low) / (base_amp_high - base_amp_low)

# 逐行计算新time值,保留原始行的时间间隔特征
dataframe2['time'] = dataframe1['time'] + time_delta_per_amp * (dataframe2['amplitude'] - dataframe1['amplitude'])

运行后前两行结果与预期完全一致,第三行结果可根据实际业务的基准值调整系数即可匹配。

内容的提问来源于stack exchange,提问作者shah nawaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:42:25