有哪些方法可以合并时间戳不完全匹配的列?
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的时间戳<5分钟,并且session_id和employee_id也匹配,是否有一种有效的加入方式?如果存在匹配记录,则时间戳将始终稍晚于DF1,因为事件在将来某个时间点触发 .
['employee_id', 'session_id', 'timestamp<5minutes']
Edit - 我以为有人会遇到过这个问题 .
我在想这样做:
-
在每个数据帧上记录我的时间戳
-
创建一个时间戳为5分钟的列(四舍五入)
-
创建一个时间戳列 - 5分钟(舍入)
-
创建一个10分钟的间隔字符串以加入文件
df1 ['low_time'] = df1 ['start_time'] - timedelta(分钟= 5)
df1 ['high_time'] = df1 ['start_time'] timedelta(分钟= 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分钟间隔或范围内的时间
2 回答
考虑以下迷你版本的问题:
这使
您希望在合并时将
df2[0:3]
视为df1[0:3]
的重复项(因为它们分别相隔不到5分钟),但将df1[3]
和df2[3]
视为单独的会话 .解决方案1:间隔匹配
这基本上就是您在编辑中建议的内容 . 您希望将两个表中的时间戳映射到以时间戳为中心的10分钟间隔,四舍五入到最接近的5分钟 .
每个间隔可以通过其中点唯一地表示,因此您可以将时间戳上的数据帧合并到最接近的5分钟 . 例如:
打印
请注意,这不完全正确 . 会话
df1[2]
和df2[2]
不会被视为重复,尽管它们相距仅3分钟 . 这是因为它们位于区间边界的不同侧 .解决方案2:一对一匹配
这是另一种方法,它取决于
df1
中的会话在df2
中具有零或一个重复的条件 .我们将
df1
中的时间戳替换为df2
中与employee_id
匹配的最接近的时间戳,并且session_id
and 距离不到5分钟 .打印
这种方法要慢得多,因为你必须为
df1
中的每一行搜索整个df2
. 我写的内容可能会进一步优化,但这仍需要很长时间才能完成大型数据集 .我会尝试在熊猫中使用这个方法:
pandas.merge_asof()
你感兴趣的参数是
direction
,tolerance
,left_on
和right_on
Build @Igor答案:
输出