熊猫合并具有不同时间戳的数据帧一
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 行生成 a
、NaN
和 a
,而应该都是 @ 987654329@s.以上是关于熊猫合并具有不同时间戳的数据帧一的主要内容,如果未能解决你的问题,请参考以下文章