如何对不等长的Pandas时间序列进行拉伸与插值?
解决数值型时间序列的拉伸与插值问题
针对你手头的数值型时间序列(非日期时间格式)无法使用pd.resample()的问题,这里提供两种实用方案,实现所有序列行数统一:
方案一:基于Pandas原生方法(复用最长时间轴)
以最长的时间序列(示例中为ta)为基准,将较短序列重新索引到该基准轴并完成插值:
import numpy as np import pandas as pd # 生成原始数据 ta = np.arange(0, 1, 0.01) av = np.random.rand(ta.shape[0], 1).flatten() tb = np.arange(0, 1, 0.015) bv = np.random.rand(tb.shape[0], 1).flatten() # 单独处理每个时间-数值对,避免原DataFrame的NaN干扰 a_series = pd.Series(av, index=ta) # 将b序列重新对齐到ta的时间点,用线性插值补全缺失值 b_series = pd.Series(bv, index=tb).reindex(ta).interpolate(method='linear') # 生成统一行数的新DataFrame unified_df = pd.DataFrame({ 'ta': a_series.index, 'a_val': a_series.values, 'tb': a_series.index, # 若需保留tb的插值后时间逻辑,可替换为b_series.index 'b_val': b_series.values })
方案二:用Scipy自定义目标时间轴(更灵活)
如果需要自定义目标行数(比如固定为某一数值),可以生成均匀分布的时间轴,再对所有序列插值:
import numpy as np import pandas as pd from scipy.interpolate import interp1d # 生成原始数据 ta = np.arange(0, 1, 0.01) av = np.random.rand(ta.shape[0], 1).flatten() tb = np.arange(0, 1, 0.015) bv = np.random.rand(tb.shape[0], 1).flatten() # 设定目标行数(取最长序列长度或自定义数值) target_rows = max(len(ta), len(tb)) # 生成0到1之间均匀分布的目标时间轴 target_time = np.linspace(0, 1, target_rows) # 对两个序列分别执行插值 a_interp = interp1d(ta, av, kind='linear')(target_time) b_interp = interp1d(tb, bv, kind='linear')(target_time) # 组装新DataFrame unified_df = pd.DataFrame({ 'ta': target_time, 'a_val': a_interp, 'tb': target_time, 'b_val': b_interp })
关键细节
- 插值方法:示例用线性插值(
kind='linear'),可根据需求替换为'nearest'(最近邻)、'quadratic'(二次插值)等; - 时间轴选择:若不需要统一时间轴,可分别为每个序列生成对应长度的拉伸时间轴,再插值对应数值;
- 避开NaN干扰:原DataFrame因序列长度差异存在NaN,单独处理每个时间-数值对可避免插值逻辑出错。
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

