如何从含嵌套列表的字典生成以时间戳为索引的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
相关产品推荐
相关产品推荐

