我在熊猫中有三个数据框,例如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
)正常运行,一切都将很容易合并数据框。
答案 0 :(得分:1)
因此,我不确定100%是否要求将三个数据框与下一个有效观察值合并后如何完成缺失值。 如果是这样,那是我发现的最快方法(不是最优雅的方法):
获取部分数据:
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
您可能需要调整最后一行,因为没有下一行可以填充其中的值。但仅此而已。