熊猫合并具有不同时间戳的数据帧一

Posted

技术标签:

【中文标题】熊猫合并具有不同时间戳的数据帧一【英文标题】:Pandas Merging Dataframes One with Different Time Stamps 【发布时间】:2021-11-20 21:57:51 【问题描述】:

假设我们有两个数据帧,一个带有时间戳,另一个带有开始和结束时间戳。 df1 和 df2 为:

DateTime Value1 StartDateTime EnddDateTime Value2
2020-01-11 12:30:00 1 2020-01-11 12:23:12 2020-01-11 13:10:00 a
2020-01-11 13:00:00 2 2020-01-11 14:12:20 2020-01-11 14:20:34 b
2020-02-11 13:30:00 3 2020-01-11 15:20:00 2020-01-11 15:28:10 c
2020-02-11 14:00:00 4 2020-01-11 15:45:20 2020-01-11 16:26:23 d
2020-02-11 14:30:00 5
2020-02-11 15:00:00 6
2020-02-11 15:30:00 7
2020-02-11 16:00:00 8

df1 的时间戳表示从DateTime 列中的时间开始的半小时。我想将 df2 开始和结束时间与这 20 分钟的时间段相匹配。如果 df2 的周期(开始和结束之间的时间)与 df1 中的两个 DateTime 匹配,则 df2 的值可能落在 df1 的两行中,即使只有一秒钟。结果应该是如下的数据框。

DateTime Value1 Value2
2020-01-11 12:30:00 1 a
2020-01-11 13:00:00 2 a
2020-02-11 13:30:00 3 Nan
2020-02-11 14:00:00 4 b
2020-02-11 14:30:00 5 Nan
2020-02-11 15:00:00 6 c
2020-02-11 15:30:00 7 d
2020-02-11 16:00:00 8 d

对有效合并大数据有什么建议吗?

【问题讨论】:

您介意将数据帧作为字典共享吗? df.to_dict('records') 【参考方案1】:

那里可能有更短更好的答案,因为我是直接写的。

融化第二个数据帧

df3=pd.melt(df2, id_vars=['Value2'], value_vars=['StartDateTime', 'EnddDateTime'],value_name='DateTime').sort_values(by='DateTime')

在两个 dfs 上创建临时列。原因是,您想从 datetime 获取时间,将该时间附加到要在合并中使用的统一日期

df1['DateTime1']=pd.Timestamp('today').strftime('%Y-%m-%d') + ' ' +pd.to_datetime(df1['DateTime']).dt.time.astype(str)
df3['DateTime1']=pd.Timestamp('today').strftime('%Y-%m-%d') + ' ' +pd.to_datetime(df3['DateTime']).dt.time.astype(str)

将上面计算的新列日期时间转换为日期时间

df3["DateTime1"]=pd.to_datetime(df3["DateTime1"])
df1["DateTime1"]=pd.to_datetime(df1["DateTime1"])

最后,合并一个时间容差

   final = pd.merge_asof(df1, df3, on="DateTime1",tolerance=pd.Timedelta("39M"),suffixes=('_', '_df2')).drop(columns=['DateTime1','variable','DateTime_df2'])

              DateTime_  Value1 Value2
0  2020-01-11 13:00:00       2      a
1  2020-02-11 13:30:00       3      a
2  2020-02-11 14:00:00       4    NaN
3  2020-02-11 14:30:00       5      b
4  2020-02-11 15:00:00       6    NaN
5  2020-02-11 15:30:00       7      c
6  2020-02-11 16:00:00       8      d

【讨论】:

非常感谢您的及时答复。熔化第二个数据帧的问题是,如果一行的持续时间(开始和结束之间的时间)覆盖 df1 中的三行或更多行,那么中间行将是 NaN。例如,如果 df2 中第一行的 EndDatTime 是 13:40,则代码将为 df1 的第 0、1 和 2 行生成 aNaNa,而应该都是 @ 987654329@s.

以上是关于熊猫合并具有不同时间戳的数据帧一的主要内容,如果未能解决你的问题,请参考以下文章

合并具有不同时间戳(不同时间间隔)的两个数据帧

效率:删除具有相同时间戳的行,同时仍然具有该时间戳的第二列的中值

如何在熊猫数据框中设置时间戳的偏移量?

SQL查询以获取具有不同时间戳的多行

如何从具有最后时间戳的数据框中选择不同的记录

Python合并两个具有不同日期时间的数据框[重复]