在MATLAB中对齐两类传感器时间序列并实现逐小时平均的方法
实现步骤(MATLAB环境)
以下是完整可直接运行的实现逻辑,默认你已提前加载了传感器A的时间向量timeA、测量值向量dataA,传感器B的时间向量timeB、测量值向量dataB。
1. 原始数据转timetable格式
MATLAB的timetable是处理时间序列的专用数据结构,后续的区间裁剪、时间对齐、聚合计算都可以直接调用内置函数完成:
% 若你的时间向量原本是字符/字符串格式,先转datetime格式,已为datetime可跳过这一步 timeA = datetime(timeA, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); timeB = datetime(timeB, 'InputFormat', 'yyyy-MM-dd HH:mm:ss'); % 生成对应timetable ttA = timetable(timeA, dataA); ttB = timetable(timeB, dataB);
2. 提取传感器B的有效连续记录区间
因为B是间隔启动的,先通过相邻采样点的时间差划分连续记录段:
% 计算B相邻两个记录的时间间隔 timeDiffB = diff(ttB.timeB); % 设定段间隔阈值:相邻记录差超过2小时就判定为两段不同的有效记录,可按需调整阈值 threshold = hours(2); % 标记所有段的边界位置 segIdx = [1; find(timeDiffB > threshold)+1; height(ttB)+1]; % 生成所有有效区间的起止时间 validIntervals = table(); for i = 1:length(segIdx)-1 validIntervals.start(i) = ttB.timeB(segIdx(i)); validIntervals.end(i) = ttB.timeB(segIdx(i+1)-1); end
如果已经提前知道B的所有启动/停止时间,也可以跳过上面的计算,直接给validIntervals的start和end列赋值即可。
3. 按B的有效区间裁剪A的记录
只保留A中落在B有效记录区间内的采样点:
% 初始化裁剪掩码 maskA = false(height(ttA), 1); for i = 1:height(validIntervals) maskA = maskA | (ttA.timeA >= validIntervals.start(i) & ttA.timeA <= validIntervals.end(i)); end % 得到A的有效数据 ttA_valid = ttA(maskA, :);
4. 逐小时聚合计算平均值
调用内置retime函数直接完成按小时的均值聚合:
% 时间戳统一取对应小时的起始时刻,无有效数据的小时返回NaN ttA_hourly = retime(ttA_valid, 'hourly', 'mean'); ttB_hourly = retime(ttB, 'hourly', 'mean');
5. 对齐两个传感器的小时平均结果
% 仅保留两个传感器都有有效数据的小时,如要保留所有B有数据的小时,第三个参数改成'left'即可 tt_aligned = synchronize(ttA_hourly, ttB_hourly, 'inner');
最终输出的tt_aligned就是对齐后的逐小时平均结果,包含时间、A的小时均值、B的小时均值三列。
内容的提问来源于stack exchange,提问作者user17206266
相关产品推荐
相关产品推荐

