【发布时间】:2019-01-07 17:57:59
【问题描述】:
我们想从 IMF 网站获取数据并将其转储到 csv 文件中。获取数据是使用 IMF 为此目的发布的 API 完成的。但是,检索到的 json 列表包含一个嵌套字典,该字典可能为空或具有不同数量的元素,具体取决于数据不为空的年份。 下面是一个 sn-p,用于查明问题。我们正在通过 jupyter notebook 使用 python 3.6.5
我们尝试过使用 json_normalize 但它只能将顶层转换为 csv。 JSON 的第二个元素包含一个嵌套字典,这会导致不需要的输出。
import requests
from pandas.io.json import json_normalize
#url = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/A.AU..?startPeriod=2017&endPeriod=2019'
url = 'http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/IFS/A.AU.FDSBT_XDC+GG_GEG_G01_XDC+FFSE_XDC.?startPeriod=2017&endPeriod=2019'
# Navigate to series in API-returned JSON data
json_raw = (requests.get(f'{url}').json()['CompactData']['DataSet']['Series'])
json_normalize(json_raw)
json_normalize 导致输出为(观察包含嵌套字典数组的“Obs”导致问题)
@FREQ @INDICATOR @REF_AREA @TIME_FORMAT @UNIT_MULT Obs Obs.@OBS_VALUE Obs.@TIME_PERIOD
0 A FFSE_XDC AU P1Y 6 NaN 15750.23064215 2017
1 A GG_GEG_G01_XDC AU P1Y 6 [{'@TIME_PERIOD': '2017', '@OBS_VALUE': '4168'}, {'@TIME_PERIOD': '2018', '@OBS_VALUE': '3443'}] NaN NaN
2 A FDSBT_XDC AU P1Y 6 NaN NaN NaN
我们希望得到如下结果,以便我们可以将结构化格式转储到 csv
@FREQ @INDICATOR @REF_AREA @TIME_FORMAT @UNIT_MULT Obs.@OBS_VALUE_0 Obs.@TIME_PERIOD_0 Obs.@OBS_VALUE_1 Obs.@TIME_PERIOD_1
0 A FFSE_XDC AU P1Y 6 15750.23064215 2017 NaN NaN
1 A GG_GEG_G01_XDC AU P1Y 6 4168 2017 3443 2018
2 A FDSBT_XDC AU P1Y 6 NaN NaN NaN NaN
【问题讨论】: