如何将AESO API返回的嵌套JSON数据转换为包含指定字段的扁平化Pandas DataFrame
如何将AESO API返回的嵌套JSON数据转换为包含指定字段的扁平化Pandas DataFrame
看起来你已经成功从AESO API获取到了嵌套结构的JSON数据,现在需要把asset_list里的多层嵌套数据展开成包含asset_ID、asset_class、begin_date_utc、begin_date_mpt和metered_volume的扁平化DataFrame对吧?我们可以通过两次使用pd.json_normalize()来实现这个需求,下面是具体的步骤和代码:
步骤说明
你的JSON数据有两层核心嵌套:
- 顶层的
return数组里,每个元素包含pool_participant_ID和asset_list数组 asset_list里的每个元素又包含asset_ID、asset_class和metered_volume_list数组
我们需要先展开asset_list拿到资产基础信息,再展开里面的metered_volume_list得到时间维度的计量数据,同时保留所有需要的上层字段。
完整代码示例
import requests import pandas as pd API_KEY = 'api_key_here' merit_order_url = 'https://api.aeso.ca/report/v1/meteredvolume/details?startDate=2022-01-01' headers = {'accept': 'application/json', 'X-API-Key': API_KEY} # 发起API请求并解析响应 response = requests.get(merit_order_url, headers=headers) response.raise_for_status() # 检查请求是否成功,失败则抛出异常 data = response.json() # 第一步:展开asset_list,同时保留pool_participant_ID(不需要的话可删除meta参数) df_assets = pd.json_normalize( data['return'], record_path='asset_list', # 指定要展开的嵌套数组 meta='pool_participant_ID' # 保留上层的参与者ID字段 ) # 第二步:展开每个资产对应的metered_volume_list,保留资产相关字段 final_df = pd.json_normalize( df_assets.to_dict('records'), # 将DataFrame转为字典列表供json_normalize处理 record_path='metered_volume_list', meta=['pool_participant_ID', 'asset_ID', 'asset_class'] # 保留需要的资产相关字段 ) # 可选优化:将metered_volume从字符串转为数值类型,方便后续分析计算 final_df['metered_volume'] = pd.to_numeric(final_df['metered_volume']) # 查看结果 print(final_df.head())
代码解释
response.raise_for_status():这一步是为了确保API请求成功,如果返回4xx/5xx错误会直接抛出异常,避免后续处理无效数据。- 第一次
json_normalize:把每个参与者对应的asset_list展开成单独的行,同时带上pool_participant_ID,这样我们就得到了每个资产的基础信息和对应的计量数据列表。 - 第二次
json_normalize:把每个资产的metered_volume_list展开成单独的行,同时保留资产ID、类型和参与者ID,最终得到完全扁平化的DataFrame,每一行对应一个资产在某个时间点的计量数据。 - 转换
metered_volume类型:原始JSON里的计量值是字符串格式,转为数值类型后可以直接进行求和、均值等统计操作。
这样处理后,你就得到了包含所有需要字段的DataFrame,完全符合你的需求~
备注:内容来源于stack exchange,提问作者user17059762
相关产品推荐
相关产品推荐

