R语言计算跨零点睡眠时间:输出时分格式及代码解析需求
R语言计算睡眠时间:代码解析与优化方案
原代码逻辑解析
原代码通过日期调整处理跨天就寝的情况,具体步骤如下:
- 给起床时间
wake和临时就寝时间tmpbed拼接当天日期Sys.Date(),转成带日期的时间字符串,让difftime能计算时间差。 - 逐行计算两者的时间差(小时为单位):如果差值为负,说明就寝时间是第二天凌晨(比如凌晨1点睡觉、当天8点起床,直接计算会得到负数)。
- 生成日期调整值
adjust:当时间差为负时adjust取-1,否则为0;把就寝时间的日期改为Sys.Date()+adjust(即前一天),修正跨天的错误。 - 用调整后的就寝时间重新计算,得到正确的正数睡眠时间。
问题解决:输出小时+分钟格式
原代码仅输出小时数,我们可以拆分总分钟数来得到小时+分钟的格式,同时优化代码效率(避免apply循环):
sleepTime <- function(bed, wake) { # 转换为带日期的POSIXct时间格式 wake_time <- as.POSIXct(paste(Sys.Date(), wake)) bed_time <- as.POSIXct(paste(Sys.Date(), bed)) # 计算初始时间差,判断是否需要调整日期 time_diff <- difftime(wake_time, bed_time, units = "hours") bed_time_adjusted <- ifelse(time_diff < 0, as.POSIXct(paste(Sys.Date() - 1, bed)), bed_time) # 计算总睡眠分钟数,拆分小时和分钟 total_mins <- as.numeric(difftime(wake_time, bed_time_adjusted, units = "mins")) hours <- floor(total_mins / 60) mins <- round(total_mins %% 60) # 格式化输出 paste0(hours, "小时", mins, "分钟") }
测试示例:
# 跨天情况:凌晨1点睡,早上7点起 sleepTime("01:00", "07:00") # 输出"6小时0分钟" # 非跨天情况:晚上10点睡,早上6点起 sleepTime("22:00", "06:00") # 输出"8小时0分钟"
更简洁的实现方案(用lubridate包)
借助R语言专门处理时间的lubridate包,代码更直观简洁,无需手动拼接日期:
library(lubridate) sleepTime_lubridate <- function(bed, wake) { # 直接解析时分秒字符串,无需日期 wake_t <- hms(wake) bed_t <- hms(bed) # 处理跨天:如果就寝时间晚于起床时间,说明是前一天就寝,加24小时后计算差值 sleep_dur <- ifelse(bed_t > wake_t, wake_t + hours(24) - bed_t, wake_t - bed_t) # 提取小时和分钟并格式化 paste0(hour(sleep_dur), "小时", minute(sleep_dur), "分钟") }
这个方案利用hms直接解析时间字符串,hour和minute快速提取时间分量,逻辑清晰且代码量更少。
内容的提问来源于stack exchange,提问作者Elin
相关产品推荐
相关产品推荐

