Sensor Data采样频率不匹配场景下电压上采样插值需求咨询
实现方案
你提到的pandas resample方法是针对DatetimeIndex、TimedeltaIndex这类时间索引设计的,主要用于处理常规的时间频率转换(比如周转日、小时转分钟),你当前使用的是数值型的时间戳,不需要转换为时间格式,用重索引+插值的方案更简单高效,以下是两种可直接运行的实现方式:
方法1:Pandas实现(符合你要的pandas操作习惯)
import pandas as pd import numpy as np # 原始电压数据 volt_time = np.array([0.07, 0.14, 0.21, 0.28, 0.35, 0.42, 0.49, 0.56, 0.63, 0.7, 0.77, 0.84]) volt_value = np.linspace(2.2, 5.5, 12) # 目标16个时间点(和压力传感器对齐的序列) target_time = np.array([0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8]) # 构造索引为时间的电压序列 volt_series = pd.Series(volt_value, index=volt_time) # 重索引扩展到目标时间点后做插值,线性插值是传感器数据最常用的插值方式 upsampled_volt = volt_series.reindex(volt_series.index.union(target_time))\ .interpolate(method='linear')\ .reindex(target_time) print(upsampled_volt)
如果需要更换插值方式,直接修改interpolate的method参数即可,可选参数包括quadratic(二次插值)、spline(样条插值)等。
方法2:Scipy轻量插值实现(不需要依赖pandas索引操作)
如果不需要用到pandas的其他数据处理能力,直接用scipy的一维插值工具更简洁:
from scipy.interpolate import interp1d import numpy as np # 原始数据和目标时间点定义和上面一致 volt_time = np.array([0.07, 0.14, 0.21, 0.28, 0.35, 0.42, 0.49, 0.56, 0.63, 0.7, 0.77, 0.84]) volt_value = np.linspace(2.2, 5.5, 12) target_time = np.array([0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8]) # 生成插值函数,fill_value参数用于处理边界点超出原始时间范围的外插需求 f = interp1d(volt_time, volt_value, kind='linear', fill_value="extrapolate") upsampled_volt = f(target_time) print(upsampled_volt)
注意事项
- 你提供的目标时间第一个点0.05早于电压数据最早时间0.07,需要做边界外插,如果不需要外插可以把目标时间范围限制在原始电压的时间范围内,或者自定义边界填充值
- 普通传感器场景下线性插值的精度已经足够,对平滑度要求高的场景可以选择更高阶的插值方法
内容的提问来源于stack exchange,提问作者Buty
相关产品推荐
相关产品推荐

