Python处理多JSON输入 计算子字段平均与求和并输出表格
实现思路
- 分别加载
metric1.json和metric2.json文件,优先校验两个文件的服务列表一致性,避免后续计算出现错配 - 处理
metric1.json的服务数据:遍历每个服务的pointlist,跳过点位第一个纪元时间戳字段,对剩余数值计算平均值 - 处理
metric2.json的服务数据:遍历每个服务的pointlist,跳过点位第一个纪元时间戳字段,对剩余数值求和 - 最终整合结果,直接输出标准Markdown格式表格
示例实现代码(Python)
import json def calc_service_metrics(metric1_path: str, metric2_path: str) -> list: # 加载两份输入数据 with open(metric1_path, "r", encoding="utf-8") as f: metric1 = json.load(f) with open(metric2_path, "r", encoding="utf-8") as f: metric2 = json.load(f) res = [] # 按服务一一对应计算指标,默认两份数据服务顺序完全匹配 for m1_svc, m2_svc in zip(metric1["services"], metric2["services"]): # 可选校验服务名称一致性,避免输入数据异常导致计算错误 assert m1_svc["service_name"] == m2_svc["service_name"], "两份输入的服务列表不匹配" svc_name = m1_svc["service_name"] # 计算metric1平均值 val_total = 0 val_cnt = 0 for point in m1_svc["pointlist"]: for v in point[1:]: val_total += v val_cnt += 1 avg_m1 = val_total / val_cnt if val_cnt else 0 # 计算metric2总和 sum_m2 = 0 for point in m2_svc["pointlist"]: sum_m2 += sum(point[1:]) res.append({ "服务名称": svc_name, "metric1平均值": round(avg_m1, 2), "metric2总和": round(sum_m2, 2) }) return res if __name__ == "__main__": final_data = calc_service_metrics("metric1.json", "metric2.json") # 输出Markdown表格 print("| 服务名称 | metric1平均值 | metric2总和 |") print("| --- | --- | --- |") for item in final_data: print(f"| {item['服务名称']} | {item['metric1平均值']} | {item['metric2总和']} |")
补充说明
- 兼容单点位除时间戳外有多个数值的场景,单点位仅含时间戳+1个数值的通用场景也可正常运行
- 输出默认保留2位小数,可根据业务需求修改
round函数的参数调整精度 - 若需要输出JSON、CSV等其他格式,直接修改最终输出部分的逻辑即可
内容的提问来源于stack exchange,提问作者R Wagner
相关产品推荐
相关产品推荐

