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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:25:28