基于日期与出入类型清洗df重复记录 计算楼宇内人员停留时长
楼宇人员出入记录冗余清洗方案
核心逻辑
针对设备短时间重复录入同类型Entry/Exit的问题,核心思路是按单人员+单天分组后,过滤相邻同类型且时间差小于阈值的重复记录,同时保证出入记录交替有序,不需要预设删除行数,全量适配任意规模数据集。
具体执行步骤
- 第一步:预处理数据格式
先把Date列转换为pandas可识别的datetime格式,同时如果数据集包含多人员记录,需保留人员ID字段用于分组 - 第二步:分组排序
按「人员ID + 日期(仅取年月日)」分组,单分组内按Date字段升序排序,保证记录按时间先后排列 - 第三步:过滤重复同类型记录
对每个分组内的记录,计算当前记录和上一条记录的类型差、时间差,满足以下两个条件之一的保留:- 和上一条记录的Type类型不同
- 和上一条记录Type相同,但时间差大于等于你设定的重复判定阈值(推荐设为5分钟,覆盖数秒到数分钟的错误场景)
- 第四步:校验有效停留(可选)
对最终成对的Entry和Exit计算停留时长,过滤掉停留时长小于10分钟的无效记录对,符合业务规则要求。
可直接运行的pandas代码示例
import pandas as pd # 阈值配置,可根据实际业务调整 REPEAT_THRESHOLD = pd.Timedelta(minutes=5) # 同类型记录间隔小于5分钟判定为重复 EFFECTIVE_STAY = pd.Timedelta(minutes=10) # 有效停留最短时长 # 1. 读取并预处理数据 df['Date'] = pd.to_datetime(df['Date']) # 提取日期用于单日分组 df['date_only'] = df['Date'].dt.date # 2. 按人员+日期分组处理(如果数据集没有人员ID,可去掉groupby里的'user_id',仅按date_only分组即可) clean_df = [] for (user_id, date), group in df.groupby(['user_id', 'date_only']): # 按时间升序排序 group = group.sort_values('Date').reset_index(drop=True) # 计算和上一条记录的类型差、时间差 group['prev_type'] = group['Type'].shift(1) group['prev_date'] = group['Date'].shift(1) group['time_diff'] = group['Date'] - group['prev_date'] # 生成保留记录的掩码 keep_mask = ( (group['prev_type'].isna()) # 分组内第一条记录直接保留 | (group['Type'] != group['prev_type']) # 和上一条类型不同直接保留 | (group['time_diff'] >= REPEAT_THRESHOLD) # 同类型但间隔超过阈值保留 ) filtered = group[keep_mask][['Date', 'Type']].reset_index(drop=True) # 可选:校验有效停留,过滤时长不足的无效记录对 # 因为无人过夜,单日记录一定是Entry/Exit成对出现 for i in range(0, len(filtered), 2): if i+1 >= len(filtered): break entry_time = filtered.loc[i, 'Date'] if filtered.loc[i, 'Type'] == 'Entry' else filtered.loc[i+1, 'Date'] exit_time = filtered.loc[i+1, 'Date'] if filtered.loc[i+1, 'Type'] == 'Exit' else filtered.loc[i, 'Date'] if exit_time - entry_time < EFFECTIVE_STAY: filtered.drop([i, i+1], inplace=True) clean_df.append(filtered) # 合并所有分组的清洗结果 clean_df = pd.concat(clean_df, ignore_index=True)
方案优势
- 效率高:仅需一次分组遍历,时间复杂度为O(n),支持百万级以上数据集快速处理
- 适配性强:不需要提前指定删除行数,自动适配任意规模的输入数据
- 准确率高:既可以过滤完全重复的同时刻记录,也能过滤间隔数分钟的同类型错误记录,同时保证出入顺序正确
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

