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

如何合并股票价格Series生成类Yahoo!Finance风格DataFrame?Join/Merge无效

可行,以下是具体实现方案

首先明确:Yahoo!Finance格式的核心是日期为行索引,列采用多级索引(第一级为股票代码ticker,第二级为open/high/low/close等字段)。你用join/merge无效,是因为这两个方法主要用于行维度的匹配合并,而我们需要的是列维度的层级扩展,换用concat或pivot即可解决。

步骤1:将Series转换为结构化DataFrame

如果你的每个Series是单条股票记录的集合(比如每个元素是包含date/ticker/open/high/low/close的字典),先转成DataFrame:

import pandas as pd

# 假设两个Series分别为s1、s2
df1 = pd.DataFrame(s1.tolist())
df2 = pd.DataFrame(s2.tolist())

# 日期转datetime类型,确保索引格式正确
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'])

步骤2:构建Yahoo!Finance格式DataFrame

方法一:用concat直接合并(适合单只股票数据已按日期索引的情况)

先提取每只股票的行情字段,再通过concat指定keys参数生成多级列:

# 提取行情字段,设置日期为索引
df1_ohlc = df1.set_index('date')[['open', 'high', 'low', 'close']]
df2_ohlc = df2.set_index('date')[['open', 'high', 'low', 'close']]

# 获取两只股票的ticker(假设每个df内ticker唯一)
ticker1 = df1['ticker'].unique()[0]
ticker2 = df2['ticker'].unique()[0]

# 合并为Yahoo格式
yahoo_df = pd.concat([df1_ohlc, df2_ohlc], axis=1, keys=[ticker1, ticker2])

方法二:用pivot重塑结构(适合多只股票数据混合的情况)

如果后续还要添加更多股票,这种方式更灵活:

# 合并所有股票数据到一个DataFrame
all_stocks = pd.concat([df1, df2])

# 重塑为多级列结构
yahoo_df = all_stocks.pivot(
    index='date',
    columns='ticker',
    values=['open', 'high', 'low', 'close']
)
# 调整列顺序(可选,让metric在第二级)
yahoo_df = yahoo_df.swaplevel(axis=1).sort_index(axis=1)

验证结果

最终的yahoo_df结构和Yahoo!Finance导出的数据完全一致:

  • 行索引是日期(datetime类型)
  • 列是多级索引:第一级为ticker,第二级为open/high/low/close

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:10:43