基于Wi-Fi时序日志计算用户在各楼层的停留时长
解决Wi-Fi日志中按用户计算各楼层停留时长的问题
步骤1:清理重复记录
先处理原始数据里的重复项,按用户、楼层、时间戳核心维度去重,避免后续计算被冗余数据干扰:
import pandas as pd import numpy as np # 确保DateTime列是datetime类型(未转换的话先执行这步) df["DateTime"] = pd.to_datetime(df["DateTime"]) # 按用户ID、楼层、时间戳去重,保留第一条记录 df = df.drop_duplicates(subset=["UserID", "Floor", "DateTime"], keep="first")
步骤2:识别用户的楼层切换事件
先按用户和时间排序,对比每条记录与上一条的楼层是否变化,标记切换点,再为每个用户的连续楼层停留段分配唯一标识:
# 按用户和时间升序排序 df = df.sort_values(by=["UserID", "DateTime"]) # 标记楼层切换行(用户第一条记录默认是切换起点) df["Floor_Change"] = df["Floor"] != df.groupby("UserID")["Floor"].shift(1) df["Floor_Change"] = df["Floor_Change"].fillna(True) # 为每个用户的连续停留段生成分组ID df["Stay_Segment"] = df.groupby("UserID")["Floor_Change"].cumsum()
步骤3:计算每个停留段的时长
按用户、楼层、停留段分组,取每个段的起止时间并计算时长:
# 分组计算每个停留段的起止时间 user_floor_duration = df.groupby(["UserID", "Floor", "Stay_Segment"]).agg( start_time=("DateTime", "min"), end_time=("DateTime", "max") ).reset_index() # 计算停留时长(可转换为秒/分钟便于统计) user_floor_duration["duration"] = user_floor_duration["end_time"] - user_floor_duration["start_time"] user_floor_duration["duration_seconds"] = user_floor_duration["duration"].dt.total_seconds()
可选:按用户+楼层汇总总停留时长
如果需要统计每个用户在各楼层的累计停留时间(合并同一楼层的多个停留段):
total_duration_per_user_floor = user_floor_duration.groupby(["UserID", "Floor"]).agg( total_duration=("duration", "sum"), total_seconds=("duration_seconds", "sum") ).reset_index()
关键说明
- 假设数据集包含
UserID列用于唯一标识用户,若没有则替换为实际用户识别字段(如设备MAC地址)。 - 若同一时间点用户连接多个同楼层AP,可根据实际需求调整去重逻辑(比如保留信号强度最高的记录)。
- 最终结果可按需选择保留单个停留段明细,或按用户+楼层汇总的总时长。
内容的提问来源于stack exchange,提问作者Ryan Bobo
相关产品推荐
相关产品推荐

