Python解析嵌套Json

Python解析嵌套Json,python,json,pandas,Python,Json,Pandas,我有一个json文件,我正试图解析出来,只得到两个值。”“时间戳”和“值”。 以下是我的json文件示例: {'totalCount': 1, 'nextPageKey': None, 'result': [{'metricId': 'builtin:synthetic.browser.event.visuallyComplete.load', 'data': [{'dimensions': ['SYNTHETIC_TEST_STEP-123456'], 'dimen

我有一个json文件,我正试图解析出来,只得到两个值。”“时间戳”和“值”。 以下是我的json文件示例:

    {'totalCount': 1,
 'nextPageKey': None,
 'result': [{'metricId': 'builtin:synthetic.browser.event.visuallyComplete.load',
   'data': [{'dimensions': ['SYNTHETIC_TEST_STEP-123456'],
     'dimensionMap': {'dt.entity.synthetic_test_step': 'SYNTHETIC_TEST_STEP-123456'},
     'timestamps': [
      1596326400000,
      1616976000000,
      1617062400000,
      1617148800000,
      1617235200000],
     'values': [
      3880.834490740741,
      3879.6458333333335,
      3826.3645833333335,
      3890.871527777778,
      3876.8199643493763]}]}]}
我试着用熊猫的方法:

    import pandas as pd
    pdp = pd.json_normalize(PDPjson['result'],['data'])
所以我可以把它放到数据框中,但我得到的列是日期列表,列是值列表。

我试图得到的只是一个包含两列的数据帧,时间戳和值

如何从这里执行此操作?

您可以在
时间戳和
值上应用:

pdp=pdp[['timestamps','values']]。应用(pd.Series.explode)。重置索引(drop=True)
#时间戳值
# 0  1596326400000  3880.834491
# 1  1616976000000  3879.645833
# 2  1617062400000  3826.364583
# 3  1617148800000  3890.871528
# 4  1617235200000  3876.819964

我创建了JSON对象,如下所示:

txt = '''\
{ "totalCount": 1,
  "nextPageKey": "None",
  "result": [{"metricId": "builtin:synthetic.browser.event.visuallyComplete.load",
    "data": [{"dimensions": ["SYNTHETIC_TEST_STEP-123456"],
      "dimensionMap": {"dt.entity.synthetic_test_step": "SYNTHETIC_TEST_STEP-123456"},
      "timestamps": [ 1596326400000, 1616976000000, 1617062400000,
        1617148800000, 1617235200000],
      "values": [ 3880.834490740741, 3879.6458333333335, 3826.3645833333335,
        3890.871527777778, 3876.8199643493763]}]}]}'''
PDPjson = json.loads(txt)
然后我从json_normalize开始,正如您所做的:

pdp = pd.json_normalize(PDPjson['result'], 'data')
缺少的步骤是:

result = pdp[['timestamps', 'values']].apply(lambda col: col.explode())\
    .reset_index(drop=True)
结果是:

      timestamps   values
0  1596326400000  3880.83
1  1616976000000  3879.65
2  1617062400000  3826.36
3  1617148800000  3890.87
4  1617235200000  3876.82
不必担心数值列的精度较小,它只是 Jupyter笔记本显示数据的方式

当您运行例如
result.iloc[0,1]
时,您将得到:

3880.834490740741

完全精确。

它是作为请求创建的:PDPjson=requests.get(PDP,headers=headers)。json()我这里的示例就是它的结果。所以基本上是这样的:PDP_json=requests.get(PDP,headers=headers)。json()PDP=pd.json_规范化(PDP_json['result'],['data'])PDP=PDP['timestaps','values']。应用(pd.Series.explode).reset_index(drop=True)?是的,或者如果需要,您可以将其组合在一个长命令中:
pdp=pd.json_normalize(PDPjson['result'],['data'])[['timestaps','values']]。apply(pd.Series.explode)。reset_index(drop=True)
我刚开始使用您现有的
pdp
,因为拆分它更具可读性。太棒了,谢谢你们。这是一个超级简单的解决方案。