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

如何对不等长的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:40:30