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的实现存在三个核心错误:
np.interp参数顺序错误:函数签名为np.interp(x, xp, fp),其中x是待插值的自变量值,xp是已知点的自变量序列(必须单调递增),fp是已知点对应的因变量序列,原有代码传入的参数完全颠倒了自变量和因变量的对应关系。- 传入的
xp序列(即dataframe1的amplitude列)所有值均为常数2,不满足np.interp要求的自变量序列单调不重复的前提,无法计算插值结果。 - 代码中使用的
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
相关产品推荐
相关产品推荐

