在R语言中计算与日期无关的分类别事件发生平均时间
实现方案
核心思路是将每个时间点转换为当日0点以来的总秒数,基于总秒数计算均值后再转换为标准时分秒格式,完全剥离日期信息的同时自动处理60进制进位,避免出现非法时间值。
依赖包准备
需要用到dplyr、lubridate做基础时间和数据处理,可选安装hms包简化格式化:
library(dplyr) library(lubridate) library(hms)
最简实现代码
summary_times <- df %>% group_by(category) %>% summarize(avg_time = as.character(as_hms(mean(seconds_since_midnight(times)))))
输出的avg_time为HH:MM:SS格式的字符串,可直接用于表格展示。
无额外依赖的自定义实现
如果不想引入hms包,也可以手动实现秒数到时分秒的转换,还可以灵活控制补零、四舍五入规则:
summary_times <- df %>% group_by(category) %>% summarize( avg_sec = mean(seconds_since_midnight(times)), h = avg_sec %/% 3600, m = (avg_sec %% 3600) %/% 60, s = round(avg_sec %% 60), # sprintf自动补前导零,避免出现1:5:3这类格式问题 avg_time = sprintf("%02d:%02d:%02d", h, m, s) ) %>% select(category, avg_time)
原方案问题说明
之前单独计算时分秒均值的方案,没有处理时间分量之间的60进制进位规则,比如秒的总和均值超过60时没有向分钟进位,才会出现分、秒数值超过合理范围的非法时间结果,基于总秒数统一计算的方案完全规避了该问题。
内容的提问来源于stack exchange,提问作者Joe North
相关产品推荐
相关产品推荐

