Python 如何基于时间戳合并3个数据帧?
我有三个熊猫数据帧,比如df1、df2和df3。所有数据帧的第一列是时间戳日期时间格式,如2017-01-01 12:30:00等。以下是每个数据帧的第一列示例:-Python 如何基于时间戳合并3个数据帧?,python,pandas,dataframe,datetime,timestamp,Python,Pandas,Dataframe,Datetime,Timestamp,我有三个熊猫数据帧,比如df1、df2和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
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
.....
根据建议的答案提供更多详细信息
首先,由于我的dataframes all 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分钟,而不是10分钟,因为索引的并集没有正确完成。我认为这里出现了一些问题,一旦第2步建议u_索引正常工作,一切都将很容易合并数据帧。因此我不能100%确定您要求的是如何在将三个数据帧与下一个有效观测值合并后完成缺失的值。 如果是这样的话,这是我发现的最快的方法,但不是最优雅的…: 创建一个新索引,它是三个索引的联合,在您的情况下,它将产生间隔为10分钟的时间戳。 根据新索引重新编制所有三个dfs的索引,同时分别填写缺失的值。 合并三个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
第一步
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
您可能需要调整最后一行,因为它没有可用于填充值的后续行。对于你给出的例子,你期望的结果是什么?@ Wii的结果是一个编辑将是一个数据帧在10分钟间隔,其中日期匹配在所有3个,并且作为时间,因为DF3是在30分钟的间隔,我会考虑在12:10之间的测量,12:20倍于12:00,因为记录不可用。谢谢你的详细回答。然而,我仍然得到最终的数据帧df1_n,正如你提到的,间隔30分钟,而我希望它间隔10分钟。我将根据您的代码为我的问题添加更多细节。如果你能告诉我出了什么问题,那就太好了。谢谢你。我能想到的理由是:1。索引未排序-使用index.union时,可以添加一个sort=True标志。2.元素被重复多次-您可以尝试np.uniqueu_index.values,然后将其转换回pandas index。我首先要检查的是u_索引中的整体元素数量,这应该告诉您这两个建议中的哪一个会有帮助。现在让我看看它是否奏效:再次感谢!在使用第一个建议时,我可以看到u_索引的长度为3428255,这正是我所需要的,但奇怪的是,元素被广泛重复。虽然df1的元素间隔为10分钟,长度为3428255,这正是所需要的,但由此产生的u_指数似乎有多个重复,与此指数类似['2016-01-01 00:00:00.000'、'2016-01-01 00:00.000'、'2016-01-01 00:00.000'、'2017-12-31 23:50:00.000'、'2017-12-31 23:50:00.000'],dtype='object',name='TimeStamp',length=3428255,与df1中的时间戳不同。使用第二个建议时,u_索引以10分钟为间隔,数组['2016-01-01 00:00:00.000','2016-01-01 00:10:00.000','2016-01-01 00:20:00.000','2017-12-31 23:30:00.000','2017-12-31 23:40:00.000','2017-12-31 23:50:00.000'],dtype=对象,但长度仅为105264,远低于3428255。这是我希望输出为df1形状的原始df形状,df1每隔10分钟输出一次df1。形状:3428255,28 df2。形状:11362,94 df3。形状:34576,35谢谢:-你能告诉我为什么u_索引有3428255个整体元素,但不是每隔10分钟一次吗。在最初的df1中,每10分钟一次,这件事让我困惑了好几天。再次感谢你