【发布时间】:2016-04-25 03:32:37
【问题描述】:
哪些方法可用于合并时间戳不完全匹配的列?
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的时间戳
['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 分钟间隔或范围内的时间
【问题讨论】:
-
有趣的问题。天真的解决方案是在四舍五入到最接近 5 分钟的时间戳上合并,但是如果它们碰巧位于 5 分钟标记的不同侧,这会将一些会话保留为单独的行。您可以使用随机偏移量迭代地应用该过程,最多进行一定次数的迭代,这将产生更好的结果。最稳健的解决方案是聚类算法,但这更难实现。
-
This 可以提供一些灵感。
-
理想情况下,您希望在
join操作上使用 SQL 样式的where子句,该子句使用between指定日期之一,并基于另一个日期指定两个边界。如果直接在数据库中执行此操作完全可行,或者使用像 SQLite 这样的内存数据库,我会推荐它。您需要在 pandas 中进行的 hack 会很糟糕,如果您以数据库方式进行操作,您仍然可以在之后将结果拉出到 pandas 进行交互式处理或其他任何操作。 -
@Lance 是否保证两个数据帧包含真正唯一的会话分别?即重复数据删除是否仅在您合并它们时适用?或者是否有可能在同一数据框中有两行用于“相同”会话的时间戳略有不同?
-
对不起,还是不明白。 在单个数据帧内,是否需要执行会话重复数据删除(考虑时间戳的微小差异)?