如何使用DataWeave 2.0按数组指定列分组汇总数据并统计时间周期
考勤数据统计解决方案
处理逻辑
- 遍历所有考勤日志,按项目名累加总分钟数
- 收集所有考勤日期和员工邮箱信息
- 将累加的分钟数除以60转换为小时
- 对所有考勤日期做大小比较,提取最早日期和最晚日期作为时间区间
- 按要求拼接生成timesheetName字段,整合输出最终结果
JavaScript 实现代码
function processAttendanceData(input) { const { timeLogs } = input; const result = {}; const dates = []; let emailId = ''; timeLogs.forEach(log => { // 统计项目工时 const project = log.projectName; const mins = log.hoursInMins; result[project] = (result[project] || 0) + mins; // 收集日期和邮箱 dates.push(log.workDate); if (!emailId) emailId = log.emailId; }); // 分钟转小时 Object.keys(result).forEach(key => { result[key] = result[key] / 60; }); // 处理日期区间,适配MM-DD-YYYY格式的日期排序 const sortedDates = dates.sort((a, b) => { const [m1, d1, y1] = a.split('-').map(Number); const [m2, d2, y2] = b.split('-').map(Number); return new Date(y1, m1 - 1, d1) - new Date(y2, m2 - 1, d2); }); const fromDate = sortedDates[0]; const toDate = sortedDates.at(-1); // 补充其余字段 result.emailId = emailId; result.fromDate = fromDate; result.toDate = toDate; result.timesheetName = `(${fromDate} - ${toDate})`; return result; }
Python 实现代码
from datetime import datetime def process_attendance_data(input_data): time_logs = input_data['timeLogs'] result = {} dates = [] email_id = None for log in time_logs: # 统计项目工时 project = log['projectName'] mins = log['hoursInMins'] result[project] = result.get(project, 0) + mins # 收集日期和邮箱 dates.append(log['workDate']) if not email_id: email_id = log['emailId'] # 分钟转小时 for k in result: result[k] = result[k] // 60 # 处理日期区间 date_objs = [datetime.strptime(d, '%m-%d-%Y') for d in dates] from_date = min(date_objs).strftime('%m-%d-%Y') to_date = max(date_objs).strftime('%m-%d-%Y') # 补充输出字段 result['emailId'] = email_id result['fromDate'] = from_date result['toDate'] = to_date result['timesheetName'] = f'({from_date} - {to_date})' return result
将你的输入JSON作为参数传入上述函数,即可得到和示例完全一致的输出结果。代码已经适配跨月、跨年的日期排序场景,不会出现字符串直接排序的逻辑错误。
内容的提问来源于stack exchange,提问作者user12277274
相关产品推荐
相关产品推荐

