如何按时间序列索引合并两个pandas数据帧?

时间:2018-04-07 22:22:43

标签: pandas

目前我有两个看起来像这样的数据框:

FSample

enter image description here

GMSample

enter image description here

我想要的是理想情况下的东西:

enter image description here

我尝试做类似

的事情
result = pd.concat([FSample,GMSample],axis=1)
result

但我的结果是将数据叠加在一起。 enter image description here

然后我试图像这样使用合并命令

result = pd.merge(FSample,GMSample,how='inner',on='Date')
result

由此我在'日期'

上得到了一个KeyError

所以我觉得我既缺少理解我应该如何组合这些数据帧(即多索引?)和语法来正确地做到这一点。

2 个答案:

答案 0 :(得分:1)

你得到一个关键错误,因为Date是一个索引,而" on"合并中的关键字需要一列。或者,您可以从索引中删除Symbol,然后按日期索引连接数据帧。

FSample.reset_index("Symbol").join(GMSample.reset_index("Symbol"), lsuffix="_x", rsuffix="_y")

答案 1 :(得分:1)

在pandas中使用MultiIndex通常需要您不断设置/重置索引。在这种情况下,这可能是最容易做的事情,因为pd.merge不会立即支持在MultiIndex的特定级别上进行合并。

df_f = pd.DataFrame(
    data = {
        'Symbol': ['F'] * 5,
        'Date': pd.to_datetime(['2012-01-03', '2012-01-04', '2012-01-05', '2012-01-06', '2012-01-09']),
        'Close': [11.13, 11.30, 11.59, 11.71, 11.80],
    },
).set_index(['Symbol', 'Date']).sort_index()
df_gm = pd.DataFrame(
    data = {
        'Symbol': ['GM'] * 5,
        'Date': pd.to_datetime(['2012-01-03', '2012-01-04', '2012-01-05', '2012-01-06', '2012-01-09']),
        'Close': [21.05, 21.15, 22.17, 22.92, 22.84],
    },
).set_index(['Symbol', 'Date']).sort_index()

pd.merge(df_f.reset_index(level='Date'),
         df_gm.reset_index(level='Date'),
         how='inner',
         on='Date',
         suffixes=('_F', '_GM')
).set_index('Date')

结果:

    Close_F     Close_GM
Date        
2012-01-03  11.13   21.05
2012-01-04  11.30   21.15
2012-01-05  11.59   22.17
2012-01-06  11.71   22.92
2012-01-09  11.80   22.84