首页 > 解决方案 > 如何根据时间戳合并 3 个 Pandas 数据框?

问题描述

例如,我在 Pandas 中有三个数据框df1, df2 and df3。所有数据帧的第一列是时间戳(日期时间格式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 个数据帧不可用),它将被视为12:00:00(前面的测量)合并目的。(但当然,日期应该相同)请注意,所有数据框的大小都不同,但我想根据时间戳将它们合并在一起以进行分析。谢谢!

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 

      .....

基于建议的答案的更多详细信息 首先,由于我的数据帧(全部 3 个)没有索引作为时间戳,但有列作为时间戳,我将每个索引设置为时间戳:

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

关于使用这个

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

我奇怪地得到了一个奇怪的输出,它不像需要的那样定期间隔 10 分钟。

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)

因此,最终的 df1_n 数据帧是30 min间隔而不是10 mins(因为索引的联合没有正确完成)。我认为这里出了点问题,一旦第 2 步建议的 ( u_index) 正常工作,一切都将很容易合并数据帧。

标签: pythonpandasdataframedatetimetimestamp

解决方案


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

  1. 创建一个新索引,它是三个索引的联合(在您的情况下将产生间隔为 10 分钟的时间戳)。
  2. 根据新索引重新索引所有三个 dfs,同时分别填写缺失值。
  3. 合并三个 dfs 的列(这很容易,因为在第 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

步骤 NO.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')

步骤 NO.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')

步骤 NO.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

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


推荐阅读