2. 检测数据里程对齐与采样间隔统一化
为什么采样间隔不一致会污染超限判别
轨道几何检测车在不同线路、不同检测周期或不同设备配置下,常输出不同的里程采样间隔。例如一段数据每 0.25 m 一个采样点,另一段每 1.0 m 一个采样点。若直接把两段数据按行号拼接或逐点比较,同一物理里程会对应到不同数组下标,导致峰值位置错位、区段均值失真,超限里程报告出现系统性偏移。
本案例的处理原则是:以里程为唯一基准,先统一采样间隔(重采样),再按里程区间对齐。里程是物理量,采样点序号只是存储顺序,不能作为对齐依据。
关键实现:以里程为键的重采样
下面给出一个可直接运行的 Python 实现。核心思路是:先确定统一里程网格(取两段数据里程范围的交集,按目标间隔生成),再对每段数据用 numpy.interp 做线性插值。示例数据为教学构造值,用于演示对齐逻辑,不代表真实检测结果。
import numpy as np
import pandas as pd
# 教学示例数据:两段采样间隔不同的轨距偏差
# 数据源 A:Δs = 0.25 m
mileage_A = np.arange(1000.00, 1002.01, 0.25)
gauge_A = np.array([1.2, 1.5, 1.8, 2.1, 2.4, 2.8, 3.2, 3.6, 3.9])
# 数据源 B:Δs = 1.00 m
mileage_B = np.arange(1000.00, 1002.01, 1.00)
gauge_B = np.array([1.0, 2.0, 3.5])
# 统一网格:取交集范围,目标间隔 0.50 m
target_ds = 0.50
start = max(mileage_A.min(), mileage_B.min())
end = min(mileage_A.max(), mileage_B.max())
unified_mileage = np.arange(start, end + target_ds / 2, target_ds)
# 线性插值重采样
gauge_A_rs = np.interp(unified_mileage, mileage_A, gauge_A)
gauge_B_rs = np.interp(unified_mileage, mileage_B, gauge_B)
aligned = pd.DataFrame({
"里程_m": unified_mileage,
"A_轨距偏差_mm": gauge_A_rs,
"B_轨距偏差_mm": gauge_B_rs,
})
print(aligned.round(3).to_string(index=False))
运行后输出如下(教学示例预期结果):
里程_m A_轨距偏差_mm B_轨距偏差_mm
1000.0 1.2 1.0
1000.5 1.8 1.5
1001.0 2.4 2.0
1001.5 3.2 2.75
1002.0 3.9 3.5
对齐质量检查
重采样完成后不能直接进入超限判别,必须先做三项检查,否则插值误差会被误判为轨道缺陷:
- 里程覆盖检查:统一网格必须落在两段数据里程范围的交集内,交集外不插值,避免外推产生虚假峰值。
- 插值点标记:保留“原始点/插值点”标志列,后续统计超限时对插值点单独标注,便于追溯。
- 峰值位置复核:对重采样前后的峰值里程做对比,若峰值里程偏移超过一个原始采样间隔,说明网格或插值方式需要调整。
当两段数据采样间隔相差较大(如 0.25 m 与 1.0 m)时,升采样一侧的插值点会明显增多。此时建议在超限判别阶段对插值点设置权重或仅用原始点做峰值确认,避免插值平滑效应掩盖真实短波不平顺。
不要用行号或数组下标做对齐。即使两段数据里程范围相同,只要采样间隔不同,相同下标对应的物理里程就不同,直接比较会产生系统性错位。