使用pd.json_normalize将嵌套加密货币JSON转换为指定格式DataFrame
实现方案
该JSON采用自定义分组嵌套结构:每2个元素为一组对应一个加密货币的全量数据,前一个元素存储币种名称,后一个元素存储该币种的价格、市值、交易量三类时序数据,不适用pd.json_normalize直接解析,可通过分组遍历+多表合并实现需求,完整代码如下:
import pandas as pd # 假设你的原始JSON数据已加载到cgcryptohistory_data变量中 crypto_dfs = [] # 按步长2遍历,每两个元素对应一个币种的完整数据 for i in range(0, len(cgcryptohistory_data), 2): # 提取当前币种名称 crypto_name = cgcryptohistory_data[i][0]["crypto"] # 提取当前币种的三类时序数据 metric_data = cgcryptohistory_data[i+1] # 分别处理三类指标,转成DataFrame后合并 temp_dfs = [] for metric in ["prices", "market_caps", "total_volumes"]: df = pd.DataFrame(metric_data[metric], columns=["date", f"{crypto_name} {metric}"]) temp_dfs.append(df) # 合并当前币种的三类指标,按时间戳匹配 single_crypto_df = temp_dfs[0].merge(temp_dfs[1], on="date").merge(temp_dfs[2], on="date") crypto_dfs.append(single_crypto_df) # 合并所有币种的数据,按时间戳对齐 result_df = crypto_dfs[0] for df in crypto_dfs[1:]: result_df = result_df.merge(df, on="date", how="outer") # 按时间戳升序排序 result_df = result_df.sort_values("date").reset_index(drop=True)
可选时间对齐处理
如果不同币种返回的时间戳存在毫秒级偏差,导致合并后出现大量空值,可在生成单个币种DataFrame后增加时间粒度对齐操作,例如统一对齐到分钟级:
# 将毫秒级时间戳转成datetime后舍入到分钟,再转回毫秒时间戳 single_crypto_df["date"] = pd.to_datetime(single_crypto_df["date"], unit="ms")\ .dt.floor("min")\ .view("int64") // 10**6
内容的提问来源于stack exchange,提问作者Levi Berger
相关产品推荐
相关产品推荐

