嵌套字典结构的response_json转换为指定格式pandas DataFrame
修正后的实现代码
import pandas as pd import requests from datetime import datetime # 按示例格式生成asof_date asof_date = datetime.now().strftime("%Y-%m-%d %H%M") all_page_data = [] while True: try: # 直接取最外层的id,符合需求规则,避免正则匹配误差 outer_id = response_json['id'] indicator_dfs = [] for rdata in response_json['insights']['data']: col_name = rdata['name'] # 单指标数据格式化,保留end_time作为合并关联键 single_indicator_df = pd.DataFrame(rdata['values']).rename(columns={'value': col_name}) indicator_dfs.append(single_indicator_df) # 按时间合并当前页所有指标数据,同一时间点的指标落在同一行 merged_page_df = indicator_dfs[0] for df in indicator_dfs[1:]: merged_page_df = merged_page_df.merge(df, on='end_time', how='outer') # 统一添加固定字段 merged_page_df['id'] = outer_id merged_page_df['asof_date'] = asof_date all_page_data.append(merged_page_df) # 拉取下一页数据 response = requests.get(response_json['paging']['next']) response_json = response.json() except KeyError: break # 合并所有分页数据得到最终结果 final_df = pd.concat(all_page_data, ignore_index=True) # 如果不需要保留end_time字段可以取消下面注释 # final_df = final_df.drop(columns=['end_time']) # 如果只需要保留最新时间的一行数据可以取消下面注释 # final_df = final_df.sort_values('end_time').tail(1).reset_index(drop=True)
核心逻辑说明
- 所有指标数据通过
end_time做关联合并,保证同一时间点的多个指标值落在同一行 - 直接取接口返回最外层的id字段,避免正则匹配每个指标id的误差
- 分页数据全部处理完成后统一合并,最终得到完整的DataFrame
- 示例原始数据运行后默认输出2行结果(对应两个时间点:2021-09-13、2021-09-14),无对应时间点数据的字段自动填充NaN,符合数据实际情况
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

