如何从嵌套JSON提取数据并在Python中生成指定格式DataFrame?
从嵌套JSON提取数据并生成指定格式DataFrame(Python)
前置准备
先确保安装了pandas(json是Python标准库,无需额外安装),没装的话执行:
pip install pandas
步骤详解
1. 修复JSON语法错误并加载数据
你的JSON里第三个设备的data数组存在语法错误:"rvalue:"多了冒号,要改成"rvalue",否则解析会报错。
之后把JSON数据加载进来,分两种场景:
- 本地JSON文件:用
json.load()读取; - 字符串形式:用
json.loads()解析。
2. 拆解JSON关键片段
先把JSON里的设备数据和时间区间名称拆出来,方便后续处理:
import json import pandas as pd # 示例用字符串存储JSON,可替换为文件读取逻辑 json_str = ''' { "result": [ { "deviceid": 33, "devicename": "server101", "objectName": "CPU", "data": [ { "value":0.59, "rvalue":null }, { "value":90, "rvalue":null }, { "value": 85, "rvalue":null } ] }, { "deviceid": 30, "devicename": "server10", "objectName": "CPU", "data": [ { "value":0.30, "rvalue":null }, { "value":60, "rvalue":null }, { "value": 79, "rvalue":null } ] }, { "deviceid": 0, "devicename": "server300", "objectName": "CPU", "data": [ { "value":0.10, "rvalue":null }, { "value":0.20, "rvalue":null }, { "value": 0.25, "rvalue":null }] } ], "timeRanges": [ { "name":"1st Month", "startTime":1680000000, "endTime": 1689000000 }, { "name":"2nd Month", "startTime": 1680000000, "endTime": 1689000000 }, { "name":"3rd Month", "startTime": 1680000000, "endTime": 1689000000 } ] } ''' # 解析JSON data = json.loads(json_str) device_list = data['result'] time_ranges = data['timeRanges'] # 提取时间区间名称作为列名(去掉空格匹配你要的格式) time_col_names = [tr['name'].replace(' ', '') for tr in time_ranges] # 提取统一的起始/结束时间(示例中所有设备共用同一区间) start_time = time_ranges[0]['startTime'] end_time = time_ranges[0]['endTime']
3. 构造行数据并生成DataFrame
遍历每个设备,把基础字段和对应时间的数值整理成字典,最后生成表格:
# 存储所有设备的行数据 rows = [] for device in device_list: # 填充基础字段(注意JSON里的devicename对应目标列deviceName) row = { 'deviceid': device['deviceid'], 'deviceName': device['devicename'], 'objectName': device['objectName'], 'startTime': start_time, 'endTime': end_time } # 把data中的value映射到对应时间列 for idx, col_name in enumerate(time_col_names): row[col_name] = device['data'][idx]['value'] rows.append(row) # 生成DataFrame final_df = pd.DataFrame(rows) # 调整列顺序匹配目标格式 final_df = final_df[['deviceid', 'deviceName', 'objectName', '1stMonth', '2ndMonth', '3rdMonth', 'startTime', 'endTime']] # 打印结果 print(final_df)
4. 最终输出
运行后会得到你需要的格式:
deviceid deviceName objectName 1stMonth 2ndMonth 3rdMonth startTime endTime 0 33 server101 CPU 0.59 90.0 85.0 1680000000 1689000000 1 30 server10 CPU 0.30 60.0 79.0 1680000000 1689000000 2 0 server300 CPU 0.10 0.2 0.25 1680000000 1689000000
补充说明
- 若从本地文件读取JSON,替换为:
with open('你的文件名.json', 'r') as f: data = json.load(f); - 若不同设备对应不同时间区间,需调整代码将设备数据与对应时间区间关联;
- 始终确保JSON格式正确,语法错误会导致解析失败。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

