You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期与出入类型清洗df重复记录 计算楼宇内人员停留时长

楼宇人员出入记录冗余清洗方案

核心逻辑

针对设备短时间重复录入同类型Entry/Exit的问题,核心思路是按单人员+单天分组后,过滤相邻同类型且时间差小于阈值的重复记录,同时保证出入记录交替有序,不需要预设删除行数,全量适配任意规模数据集。

具体执行步骤

  • 第一步:预处理数据格式
    先把Date列转换为pandas可识别的datetime格式,同时如果数据集包含多人员记录,需保留人员ID字段用于分组
  • 第二步:分组排序
    按「人员ID + 日期(仅取年月日)」分组,单分组内按Date字段升序排序,保证记录按时间先后排列
  • 第三步:过滤重复同类型记录
    对每个分组内的记录,计算当前记录和上一条记录的类型差、时间差,满足以下两个条件之一的保留:
    1. 和上一条记录的Type类型不同
    2. 和上一条记录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:15:08