如何基于小时时间槽拆分对象数组格式的时间序列数据
按小时时间槽拆分时间区间数据实现方案
你已经生成了对应小时整点的时间槽数组,只要通过循环遍历每个原始时间条目,逐个拆分到对应小时区间即可,完整实现如下:
const moment = require('moment'); require('moment-range'); // 生成目标日期的小时时间槽,注意要和待处理数据的日期匹配,不要直接用当前日期避免匹配失败 const targetDate = '2021-08-20'; const day_start = moment(targetDate).startOf('day').hours(7); const day_end = moment(targetDate).startOf('day').hours(15); const day = moment.range(day_start, day_end); const time_slots = Array.from(day.by('minutes', {step: 60})); // 核心拆分函数 function splitTimeRecords(inputRecords, timeSlots) { const result = []; inputRecords.forEach(record => { // 转换当前记录的起止时间为moment对象便于比较 let currentStart = moment(record.start_time); const recordEnd = moment(record.end_time); while (currentStart.isBefore(recordEnd)) { // 查找大于当前起始时间的下一个整点时间槽 const nextSlot = timeSlots.find(slot => slot.isAfter(currentStart)); // 如果下一个时间槽晚于当前记录结束时间,就用记录结束时间作为当前分段的终点 const currentEnd = nextSlot && nextSlot.isBefore(recordEnd) ? nextSlot : recordEnd; // 生成拆分后的条目 result.push({ // 如果有时区偏差问题,可以替换为 currentStart.format('YYYY-MM-DDTHH:mm:ss.SSS') start_time: currentStart.toISOString(), end_time: currentEnd.toISOString(), Type: record.Type }); // 更新下一段的起始时间,进入下一轮循环 currentStart = currentEnd.clone(); } }); return result; } // 测试输入 const input = [ { "start_time": "2021-08-20T07:00:00.000", "end_time": "2021-08-20T07:25:00.000", "Type": "A" }, { "start_time": "2021-08-20T07:25:00.000", "end_time": "2021-08-20T08:39:49.000", "Type": "B" }, { "start_time": "2021-08-20T08:39:50.000", "end_time": "2021-08-20T11:02:34.000", "Type": "C" } ]; // 调用得到输出 const output = splitTimeRecords(input, time_slots); console.log(output);
输出结果和你要求的预期格式完全一致,如果需要处理跨天的时间区间,只要调整time_slots的生成范围覆盖对应跨天的整点即可。
内容的提问来源于stack exchange,提问作者madhubala
相关产品推荐
相关产品推荐

