我不确定 json_normalize 是否可以帮助您处理这种类型的 json 响应,但我会这样做(好的,您可以优化 flatten 函数,但您明白了
import requests
import pandas as pd
response = requests.get('https://api.carbonintensity.org.uk/regional/england')
if not str(response.status_code).startswith('2'):
print(f'Status code {response.status_code}, exiting')
response_data = response.json()
def flatten(d, sep='.'):
cols = [
'regionid', 'dnoregion', 'shortname',
'from', 'to', 'intensity.forecast',
'intensity.index', 'generationmix.fuel',
'generationmix.perc'
]
items = []
for city in d.get('data', []):
item_data = [
city.get('regionid'), city.get('dnoregion'), city.get('shortname'),
None, None, None, None, None, None
]
city_items = []
for city_data in city.get('data', []):
item_data_tmp = item_data.copy()
item_data_tmp[3] = city_data.get('from')
item_data_tmp[4] = city_data.get('to')
item_data_tmp[5] = city_data.get('intensity', {}).get('forecast')
item_data_tmp[6] = city_data.get('intensity', {}).get('index')
for generationmix in city_data.get('generationmix', []):
item_data_tmp2 = item_data_tmp.copy()
item_data_tmp2[7] = generationmix.get('fuel')
item_data_tmp2[8] = generationmix.get('perc')
city_items.append(item_data_tmp2)
city_items = city_items or [item_data_tmp]
items.extend(city_items or [item_data])
return cols, items
cols, values = flatten(response_data)
df = pd.DataFrame(values, columns=cols)
print(df)
打印出来的
regionid dnoregion shortname from to intensity.forecast intensity.index generationmix.fuel generationmix.perc
0 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low biomass 6.3
1 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low coal 0.9
2 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low imports 17.2
3 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low gas 30.6
4 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low nuclear 10.2
5 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low other 0.0
6 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low hydro 0.3
7 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low solar 11.0
8 15 England England 2021-08-16T15:30Z 2021-08-16T16:00Z 152 low wind 23.5