繁体   English   中英

Python - 解析嵌套的 Json

[英]Python - Parsing Nested Json

我有 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]}]}]}

我尝试使用 pandas 的方法:

    import pandas as pd
    pdp = pd.json_normalize(PDPjson['result'],['data'])

所以我可以将它放入数据框中,但我得到的是带有日期列表的列和带有值列表的列。 在此处输入图像描述

我想要得到的只是一个带有两列时间戳和值的 dataframe。

我该如何从这里做到这一点?

您可以在timestampsvalues上应用Series.explode

pdp = pdp[['timestamps', 'values']].apply(pd.Series.explode).reset_index(drop=True)

#       timestamps       values
# 0  1596326400000  3880.834491
# 1  1616976000000  3879.645833
# 2  1617062400000  3826.364583
# 3  1617148800000  3890.871528
# 4  1617235200000  3876.819964

我创建了您的 JSON object 如下:

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 Notebook呈现数据的方式。

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

3880.834490740741

完全精确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM