有哪些方法可用于合并时间戳不完全匹配的列?
DF1:
date start_time employee_id session_id
01/01/2016 01/01/2016 06:03:13 7261824 871631182
DF2:
date start_time employee_id session_id
01/01/2016 01/01/2016 06:03:37 7261824 871631182
我可以加入 [‘date’, ‘employee_id’, ‘session_id’],但有时同一员工会在同一日期有多个相同的会话,这会导致重复。我可以删除发生这种情况的行,但如果我这样做,我将失去有效的会话。
如果 DF1 的时间戳距离 DF2 的时间戳 分钟,并且 session_id 和 employee_id 也匹配,是否有一种有效的加入方式?如果有匹配的记录,那么时间戳将总是比 DF1 稍晚,因为事件在未来的某个时间点被触发。
['employee_id', 'session_id', 'timestamp<5minutes']
编辑- 我假设之前有人会遇到这个问题。
我正在考虑这样做:
- 在每个数据帧上取我的时间戳
- 创建一个时间戳 + 5 分钟(四舍五入)的列
- 创建一个时间戳列 - 5 分钟(四舍五入)
- 创建一个 10 分钟的间隔字符串以加入文件
> df1['low_time'] = df1['start_time'] - timedelta(minutes=5) > df1['high_time'] = df1['start_time'] + timedelta(minutes=5) > df1['interval_string'] = df1['low_time'].astype(str) + df1['high_time'].astype(str) > > ``` 有人知道如何将这 5 分钟间隔四舍五入到最接近的 5 分钟标记吗? 02:59:37 - 5 分钟 = 02:55:00 02:59:37 + 5 分钟 = 03:05:00 interval_string = '02:55:00-03:05:00'
pd.merge(df1, df2, how = ‘left’, on = [‘employee_id’, ‘session_id’, ‘date’, ‘interval_string’]
”`
有谁知道如何舍弃这样的时间?这似乎可行。你仍然根据日期、员工和会话进行匹配,然后你寻找基本相同的 10 分钟间隔或范围内的时间
原文由 trench 发布,翻译遵循 CC BY-SA 4.0 许可协议
考虑以下问题的迷你版本:
这使
You would like to treat
df2[0:3]
as duplicates ofdf1[0:3]
when merging (since they are respectively less than 5 minutes apart), but treatdf1[3]
anddf2[3]
作为单独的会话。方案一:区间匹配
这基本上就是您在编辑中提出的建议。您希望将两个表中的时间戳映射到以时间戳为中心的 10 分钟间隔,四舍五入到最接近的 5 分钟。
每个间隔都可以由其中点唯一表示,因此您可以合并时间戳上的数据帧四舍五入到最接近的 5 分钟。例如:
哪个打印
请注意,这并不完全正确。会话
df1[2]
和df2[2]
不被视为重复,尽管它们仅相隔 3 分钟。这是因为它们位于区间边界的不同侧。方案二:一对一匹配
这是另一种方法,它取决于 --- 中的会话在
df1
中有零个或一个重复项的df2
。We replace timestamps in
df1
with the closest timestamp indf2
which matches onemployee_id
andsession_id
and is less than 5 minutes away.哪个打印
这种方法要慢得多,因为您必须为
df2
中的每一行搜索整个df1
。我写的内容可能会进一步优化,但这在大型数据集上仍然需要很长时间。