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

如何在Pandas中对两个时间序列进行偏移匹配并计算相似度

实现方案

下面分两种适配不同场景的实现方式:

方案1:互相关法计算固定滞后量(适用于两个序列仅存在整体偏移、无局部时序拉伸/压缩的场景)

该方案计算速度最快,70万数据量可在秒级完成计算。

步骤1:数据预处理

首先提取given的有效非空片段,同时对两个序列做z-score标准化消除幅值差异影响:

import pandas as pd
import numpy as np
from scipy.signal import correlate, correlation_lags

# 模拟数据构造
df = pd.DataFrame(
    {"measured": [20, 20, 9.8, 10.1, 4.8, 4.9, 9.7, 9.9, 2.9, 3.0, 3.1, 10.1, 10.0, 20, 20],
     "given": [np.nan, 10, 10, 5, 5, 10, 10, 3, 3, 3, 10, 10, np.nan, np.nan, np.nan]},
    index=pd.date_range("2018-01-01", periods=15, freq="s")
)

# 提取given有效序列
given_valid = df["given"].dropna().values
# 提取measured全序列
measured_full = df["measured"].values

# 标准化
def z_score(arr):
    return (arr - arr.mean()) / arr.std()
given_std = z_score(given_valid)
measured_std = z_score(measured_full)

步骤2:计算互相关与最优滞后

# 计算互相关
corr = correlate(measured_std, given_std, mode="valid")
# 计算对应的滞后量(单位为采样点间隔,此处为1秒)
lags = correlation_lags(len(measured_std), len(given_std), mode="valid")

# 找到最大相关值对应的最优滞后
max_corr_idx = np.argmax(corr)
best_lag = lags[max_corr_idx]
best_similarity = corr[max_corr_idx]

print(f"最优滞后量:{best_lag}秒")
print(f"最优相似度(归一化相关系数):{best_similarity:.3f}")

对模拟数据运行后可得到最优滞后为1秒,相关系数接近1,符合数据特征。

方案2:动态时间规整(DTW)(适用于序列存在局部时序拉伸/压缩的场景)

普通DTW时间复杂度为O(n*m)不适合大数据量,可使用fastdtw库实现线性时间复杂度计算,70万数据量可在分钟级完成:

依赖安装

pip install fastdtw scipy

实现代码

from fastdtw import fastdtw
from scipy.spatial.distance import euclidean

# 计算DTW距离与匹配路径
distance, path = fastdtw(given_std, measured_std, dist=euclidean)

# 计算平均滞后量
lags = [y - x for x, y in path]
avg_lag = np.mean(lags)

print(f"DTW距离(越小相似度越高):{distance:.3f}")
print(f"平均滞后量:{avg_lag:.1f}秒")

path变量存储了两个序列的逐点匹配关系,可直接用于后续对齐操作。


内容的提问来源于stack exchange,提问作者V.Hunon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:21:01