Python解析嵌套Json
我有一个json文件,我正试图解析出来,只得到两个值。”“时间戳”和“值”。 以下是我的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
{'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
,因为拆分它更具可读性。太棒了,谢谢你们。这是一个超级简单的解决方案。