You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:30:01