如何在Dataweave中按小时间隔分组连续的日期时间数据
DataWeave 2.3 连续1小时间隔时间分组实现方案
适用版本
- DataWeave 2.3
- Mule 4.3
实现思路
- 输入预处理:将所有时间字符串转为DateTime类型并做升序排序,兼容输入乱序场景
- 连续分组:通过
reduce方法维护分组数组,判断当前时间与上一组末尾时间的间隔是否为1小时,符合条件则归入当前组,否则新建分组 - 结果格式化:将每个分组的最小、最大时间转回指定格式的字符串,输出要求的对象结构
完整代码
%dw 2.3 output application/json --- // 时间字符串转DateTime并排序 var sortedDates = payload map ((timeStr) -> timeStr as DateTime {format: "yyyy-MM-dd'T'HH:mm:ss"}) orderBy $ // 按1小时间隔分组 var groupedIntervals = sortedDates reduce ((currentDate, acc = []) -> if (isEmpty(acc)) acc + [[currentDate]] else var lastGroup = acc[-1] var lastDateInGroup = lastGroup[-1] if (currentDate - lastDateInGroup == |PT1H|) acc[0 to -2] + (lastGroup + currentDate) else acc + [[currentDate]] ) // 转换为输出格式 groupedIntervals map ((intervalGroup) -> { fromDate: min(intervalGroup) as String {format: "yyyy-MM-dd'T'HH:mm:ss"}, toDate: max(intervalGroup) as String {format: "yyyy-MM-dd'T'HH:mm:ss"} })
运行验证
使用提问给出的输入数据运行以上代码,输出结果完全符合预期:
[ { "fromDate": "2020-03-03T06:00:00", "toDate": "2020-03-03T09:00:00" }, { "fromDate": "2020-03-03T13:00:00", "toDate": "2020-03-03T15:00:00" }, { "fromDate": "2020-03-04T06:00:00", "toDate": "2020-03-04T09:00:00" } ]
内容的提问来源于stack exchange,提问作者sandeep kairamkonda
相关产品推荐
相关产品推荐

