如何按星期(非具体日期)和小时分组统计读数,得到7*24个分组?
R语言按星期几、小时分组统计实现方案
核心思路
- 用
lubridate的wday()函数提取时间对应的星期几,支持自定义周起始日、返回文本/数值格式结果 - 用
lubridate的hour()函数提取时间对应的当日小时(取值范围0-23) - 分组统计后补全所有7*24种组合,确保没有读数、计数为0的分组也能保留
完整实现代码
library(lubridate) library(dplyr) library(tidyr) # 用于补全缺失的分组 # 示例数据构造 readings <- ymd_hms(c("2018-01-05 12:00:15", "2018-01-01 02:00:15", "2018-02-25 12:00:15", "2018-04-15 11:00:15", "2020-10-15 10:00:15", "2019-10-20 08:00:15", "2019-11-15 02:01:15", "2018-11-02 11:00:15", "2018-07-09 02:00:15", "2020-10-02 01:00:15", "2020-01-29 02:00:15", "2019-03-15 07:00:15") ) tbl <- tibble(readings) # 统计流程 stat_result <- tbl %>% mutate( # 提取星期:label=T返回星期标签,week_start=1设置周一为每周第一天,可按需调整 weekday = wday(readings, label = TRUE, abbr = FALSE, week_start = 1), # 提取小时 hour = hour(readings) ) %>% group_by(weekday, hour) %>% summarise(count = n(), .groups = "drop") %>% # 补全所有7*24的分组组合,缺失分组的计数填充为0 complete(weekday, hour = 0:23, fill = list(count = 0))
补充说明
如果需要显示中文星期标签,运行代码前先设置本地语言环境:
Mac/Linux系统运行Sys.setlocale("LC_TIME", "zh_CN.UTF-8")
Windows系统运行Sys.setlocale("LC_TIME", "Chinese")
- 最终输出的
stat_result共168行(7天24小时),完全符合724的分组要求 - 如果不需要保留计数为0的分组,删除最后一行
complete()相关代码即可 - 调整
wday()的week_start参数可以修改一周的起始日,比如设置week_start=7就会以周日为每周第一天
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

