如何计算小时这类周期性循环数据的平均值?
环形时间数据的平均计算方案
针对小时这类环形(0-23)时间数据,直接计算算术平均会因边界(23与0相邻)问题出现偏差,成熟的解决方案是使用圆形统计量,核心思路是把时间映射到单位圆上的点,通过向量平均得到真实平均时间,具体步骤:
- 将小时转换为弧度(1小时对应π/12弧度,即2π/24)
- 计算每个时间点的正弦、余弦值
- 对每个用户的正弦、余弦值分别求均值
- 通过反正切函数计算平均角度,再转换回小时
Python实现代码
import pandas as pd import numpy as np # 构造数据集 df = pd.DataFrame({"User":[0,0,1,1,1],"Hour Visited":[23,1,23,0,1]}) # 定义环形时间均值计算函数 def circular_mean(hours): # 小时转弧度 radians = hours * (2 * np.pi / 24) # 计算正弦、余弦的平均值 mean_cos = np.mean(np.cos(radians)) mean_sin = np.mean(np.sin(radians)) # 计算平均角度 mean_radian = np.arctan2(mean_sin, mean_cos) # 弧度转回小时,处理负角度情况 mean_hour = (mean_radian * (24 / (2 * np.pi))) % 24 return mean_hour # 按用户分组计算环形均值 result = df.groupby("User")["Hour Visited"].apply(circular_mean).reset_index() print(result)
输出结果
User Hour Visited 0 0 0.0 1 1 0.0
该结果符合预期:用户0的23点和1点真实平均为0点,用户1的23、0、1点真实平均也为0点。
内容的提问来源于stack exchange,提问作者FromTheAshes
相关产品推荐
相关产品推荐

