如何正确将Eurostat返回的JSON文件导入pandas提取HICP通胀数据
问题诊断
- 第一,欧盟统计局Eurostat的接口返回的JSON是特殊的多维数据集结构,不是扁平结构,直接对整个返回结果做normalize完全提取不到结构化的时序数据
- 第二,代码存在笔误:你定义的DataFrame变量是
df2,最后print的是不存在的df - 第三,冗余导入:同时导入了
urllib和requests但只用到了urllib,属于无用导入
解决方法
Eurostat返回JSON的核心结构逻辑如下:
数据的数值和维度索引是分开存储的:
dimension.geo.category.index存储国家对应的序号:HU对应0、PL对应1、SK对应2dimension.time.category.index存储日期对应的序号,从最早日期到最新日期依次编号value字段存储的键是「国家序号*总日期数 + 日期序号」,值是对应的HICP数值
可直接使用如下代码提取所需结果:
import urllib.request, json import pandas as pd url = r"http://ec.europa.eu/eurostat/wdds/rest/data/v2.1/json/en/prc_hicp_mmor?precision=1&geo=HU&geo=PL&geo=SK&unit=RCH_M&coicop=CP00" with urllib.request.urlopen(url) as response: data = json.loads(response.read().decode()) # 提取国家映射:序号->国家代码 geo_map = {v: k for k, v in data['dimension']['geo']['category']['index'].items()} # 提取时间映射:序号->日期字符串 time_map = {v: k for k, v in data['dimension']['time']['category']['index'].items()} # 总时间长度 time_count = len(time_map) # 初始化结果列表 result = [] for idx, val in data['value'].items(): idx = int(idx) geo_idx = idx // time_count time_idx = idx % time_count result.append({ 'date': time_map[time_idx], 'country': geo_map[geo_idx], 'hicp': val }) # 转成DataFrame,再转换为每个日期对应三国数值的宽表 df = pd.DataFrame(result) df_wide = df.pivot(index='date', columns='country', values='hicp').reset_index() print(df_wide)
运行后输出的df_wide每行对应一个日期,三列分别为匈牙利、波兰、斯洛伐克的同期HICP数值,完全符合需求。
内容的提问来源于stack exchange,提问作者JoshBob
相关产品推荐
相关产品推荐

