python - 如何根据时间戳合并 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
) 正常工作,一切都将很容易合并数据帧。
解决方案
因此,我不能 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
步骤 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
您可能需要调整最后一行,因为它没有下一行来填充值。但仅此而已。
推荐阅读
- scala - Akka RestartSource 不重启
- machine-learning - 在迁移学习中,网络的自定义部分叫什么?
- mongoose - 猫鼬填充不适用于具有 ObjectIds 数组的字段
- python-3.x - FileNotFoundError:pygame 中没有这样的文件或目录
- c# - .Net Core CSharp 自定义 Json 反序列化
- sqlalchemy - 在 SQLAlchemy ORM 中将joinedload结果加载为标量列表
- node.js - 如何避免 HighlevelProducer rdkafka 中的数据丢失
- javascript - 隐藏重复组件的特定实例
- c++ - 如何使用 mingw-w64 调试大型可执行文件
- cypress - 无法使用(sypress 框架)单击与另一个元素重叠的元素