You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:24:04