如何基于时间戳合并3个Pandas数据帧?

时间:2019-09-15 15:05:51

标签: python pandas dataframe datetime timestamp

我在熊猫中有三个数据框,例如df1, df2 and df3。所有数据帧的第一列是时间戳记(DateTime格式,如2017-01-01 12:30:00等。这是每个数据帧的第一列的示例:-

df1 TimeStamp
    2016-01-01 12:00:00 
    2016-01-01 12:10:00 
      .....
df2 TimeStamp
    2016-01-01 12:00:00 
    2016-01-01 12:10:00 
      .....
df3 TimeStamp
    2016-13-01 12:00:00 
    2016-13-01 12:30:00 
      .....

如您所见,前两个间隔为10分钟,而第三个间隔为30分钟。我想做的是将所有3个数据帧合并在一起,这样,在由于不可用数据而导致不完全匹配的情况下(例如12:10:00对于第3个数据帧不可用),将其视为{ {1}}(先前的度量)用于合并目的。 (但是,当然,日期应该是相同的。)请注意,所有数据框都有不同的大小,但是出于分析目的,我想基于时间戳将它们合并在一起。谢谢!

12:00:00

根据建议的更多详细信息 首先,由于我的数据框(所有3个)都没有作为时间戳记的索引,但是具有作为时间戳记的列,因此我将每个索引的索引集都设置为时间戳记:

DESIRED RESULT:
df_final TimeStamp      ..  Columns of df1 Columns of df2 Columns of df3
    2016-13-01 12:00:00
    2016-13-01 12:10:00 
    2016-13-01 12:20:00 

      .....

使用此

df1.index = df1.TimeStamp
df2.index = df2.TimeStamp
df3.index = df3.TimeStamp

我奇怪地得到了一个奇怪的输出,它没有按需要定期间隔10分钟。

u_index = df3.index.union(df2.index.union(df1.index))

因此,最终的df1_n数据帧以Index(['2016-01-01 00:00:00.000', '2016-01-01 00:00:00.000', '2016-01-01 00:00:00.000', '2016-01-01 00:00:00.000', ... '2017-12-31 23:50:00.000', '2017-12-31 23:50:00.000', '2017-12-31 23:50:00.000', '2017-12-31 23:50:00.000', dtype='object', name='TimeStamp', length=3199372) 的间隔而不是30 min的间隔(因为未正确完成索引的并集)。我认为这里出了点问题,一旦步骤2建议(10 mins)正常运行,一切都将很容易合并数据框。

1 个答案:

答案 0 :(得分:1)

因此,我不确定100%是否要求将三个数据框与下一个有效观察值合并后如何完成缺失值。 如果是这样,那是我发现的最快方法(不是最优雅的方法):

  1. 创建一个新索引,该索引是三个索引的并集(在您情况下,时间戳记的间隔为10分钟)。
  2. 根据新索引重新索引所有三个df,同时分别填写缺失值。
  3. 合并三个df的列(这很容易,因为在第2步之后它们将具有相同的索引)。

获取部分数据:

    df1
Out[48]: 
                     val_1
TimeStamp                 
2016-01-01 12:00:00     11
2016-01-01 12:10:00     12
df2
Out[49]: 
                     val_2
TimeStamp                 
2016-01-01 12:00:00     21
2016-01-01 12:10:00     22
df3
Out[50]: 
                     val_3
TimeStamp                 
2016-01-01 12:00:00     31
2016-13-01 12:30:00     32

第1步

u_index = df3.index.union(df2.index.union(df1.index))
u_index
Out[38]: Index(['2016-01-01 12:00:00', '2016-01-01 12:10:00', '2016-13-01 12:30:00'], dtype='object', name='TimeStamp')

第2步

df3_n = df3.reindex(index=u_index,method='bfill')
df2_n = df2.reindex(index=u_index,method='bfill')
df1_n = df1.reindex(index=u_index,method='bfill')

第3步

df1_n.merge(df2_n,on='TimeStamp').merge(df3_n,on='TimeStamp')
Out[47]: 
                     val_1  val_2  val_3
TimeStamp                               
2016-01-01 12:00:00   11.0   21.0     31
2016-01-01 12:10:00   12.0   22.0     32
2016-13-01 12:30:00    NaN    NaN     32

您可能需要调整最后一行,因为没有下一行可以填充其中的值。但仅此而已。