如何用Python3从复杂JSON提取指定数据集(不使用Pandas)
问题描述
通过URL获取了一段复杂JSON数据,需要用Python3在不使用Pandas的情况下,将['domain']['axes']['t']['values'](时间值)与['ranges']['global-radiation']['values'](全球辐射值)一一对应组合成行数据。但编写的代码运行出错:要么输出所有时间和辐射值,要么报字符串索引错误(因为把循环变量当作字典访问)。
JSON数据示例
{"type" : "Coverage", "title" : {"en" : "Grid Feature"}, "domain" : {"type" : "Domain", "domainType" : "Grid", "axes" : {"t" : {"values" : ["2023-05-08T08:00:00.000Z", ...]}, "x" : {"values" : [12.26646929541765]}, "y" : {"values" : [55.49876291703976]}}, "referencing" : [...]}, "parameters" : {"global-radiation" : {...}}, "ranges" : {"global-radiation" : {"type" : "NdArray", "values" : [4739083.5, ...]}}}
出错代码
data = requests.get(url) binary = data.content output = json.loads(binary) print(output['domain']['axes']['t']['values'][1]) dates = output['domain']['axes']['t']['values'] print(output['ranges']['global-radiation']['values'][1]) globrad = output['ranges']['global-radiation']['values'] print('Records:') for d in dates: print(d['domain']['axes']['t']['values'], d['ranges']['global-radiation']['values'])
问题排查与修正
错误原因
- 循环变量
d是dates列表中的单个时间字符串,而非整个JSON字典,用d['domain']访问会触发字符串索引错误。 - 原代码未实现“一一对应”逻辑,只是遍历时间列表,每次试图访问整个数据集的所有值。
修正后的代码
import requests import json # 获取并解析JSON数据 data = requests.get(url) output = json.loads(data.content) # 提取时间和辐射值列表 dates = output['domain']['axes']['t']['values'] globrad_values = output['ranges']['global-radiation']['values'] # 一一对应组合输出 print('Records:') # 使用zip配对两个列表的元素,确保时间和辐射值一一对应 for date, rad_value in zip(dates, globrad_values): print(f"时间: {date}, 全球辐射值: {rad_value}")
关键说明
- 使用
zip(dates, globrad_values)可将两个列表中索引位置相同的元素配对,实现一一对应。 - 循环直接获取配对后的单个时间字符串和辐射值,避免了对字符串进行字典索引的错误操作。
- 若两个列表长度不一致,
zip会以较短的列表长度为准,如需处理长度不一致的情况,可额外添加判断逻辑。
内容的提问来源于stack exchange,提问作者ChrPoll
相关产品推荐
相关产品推荐

