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

如何从含嵌套列表的字典生成以时间戳为索引的DataFrame

解决加密货币时间戳-价格数据的DataFrame转换问题

嘿,我来帮你搞定这个把API返回的嵌套字典转换成目标DataFrame的问题!先直接给你通用的解决方案,再拆解说明为什么之前的方法走了弯路。

通用解决方案(支持任意数量币种)

这个方法可以处理字典里的所有币种,自动按时间戳对齐数据,最终生成以时间戳为索引的多列DataFrame:

import pandas as pd

# 你的原始数据字典
coins_best = {
    'bitcoin': [[1603782192402, 13089.646908288987], [1603865643028, 13712.070136258053]],
    'ethereum': [[1603782053064, 393.6741989091851], [1603865024078, 404.86117057956386]]
}

# 初始化空DataFrame用于合并结果
final_df = pd.DataFrame()

for coin_name, price_entries in coins_best.items():
    # 将当前币种的[时间戳,价格]列表转为带列名的DataFrame
    coin_df = pd.DataFrame(price_entries, columns=['timestamp', coin_name])
    # 合并到最终DataFrame:第一次直接赋值,后续按时间戳对齐合并
    if final_df.empty:
        final_df = coin_df
    else:
        # how='outer'保留所有时间戳,how='inner'只保留共同时间戳,按需选择
        final_df = pd.merge(final_df, coin_df, on='timestamp', how='outer')

# 可选:将毫秒时间戳转为可读的datetime格式
final_df['timestamp'] = pd.to_datetime(final_df['timestamp'], unit='ms')
# 设置时间戳为索引
final_df = final_df.set_index('timestamp')

print(final_df)

为什么之前的方法没成功?

我来帮你梳理下之前尝试的问题点:

  • 最初的循环concat方法:只提取了价格值,完全丢失了时间戳信息,而且没有按时间戳对齐,自然只能得到单列数据。
  • 直接用pd.DataFrame(coins_best, columns=coins_best.keys()):这个写法会把每个[时间戳,价格]的列表当成单个单元格的值,后续拆分确实非常麻烦,不是正确的转换路径。
  • 推导式的写法:你在循环里每次都重新定义了inner_lists,导致每次循环都会覆盖之前的内容,最后只能拿到最后一个币种的数据。

结果验证

运行上面的代码后,会得到和你期望结构一致的结果(如果时间戳不完全对齐会显示NaN,可通过how='inner'过滤):

bitcoin     ethereum
timestamp                                
2020-10-27 08:23:12  13089.646908          NaN
2020-10-28 07:34:03  13712.070136          NaN
2020-10-27 08:20:53            NaN  393.674199
2020-10-28 07:17:04            NaN  404.861171

另外,你更新里提到的按天重采样聚合的方法非常实用,如果需要按时间粒度汇总数据,那一步可以完美适配这个最终的DataFrame。

内容的提问来源于stack exchange,提问作者crackerfrank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:37:32