R语言中跨午夜睡眠时间均值显示为天数的原因及转24小时制方法
问题:睡眠时间均值计算异常及转换方法
我希望计算睡眠时间的均值,但由于数据中存在午夜后的时间,计算得到的均值结果显示为天数而非24小时制时间。相关代码如下:
data <- read.table(text=" sleep_time wake_time 23:30:00 03:30:00 23:50:00 06:00:00 00:50:00 07:30:00 00:30:00 06:25:00 00:20:00 06:00:00 23:00:00 06:00:00 00:10:00 05:00:00 ", header=T) mean(times(data$wake_time)) # [1] 05:46:26 mean(times(data$sleep_time)) # [1] 10:18:34 wake <- times(data$wake_time) sleep <- times(data$sleep_time) times(mean(ifelse(sleep < wake, sleep + 1, sleep))) # Time in days: # [1] 1.000992
原因分析
times类型本质是用天数的小数存储时间:0对应00:00:00,0.5对应12:00:00,1对应次日00:00:00。当你给跨午夜的sleep加1时,相当于给时间值加了一整天(数值+1),计算均值后得到的结果大于1。而times()函数仅处理0到1之间的数值(对应一天内的时间),大于1的部分会被识别为完整天数,因此输出显示为带小数的天数格式。
解决方法
计算均值后,取结果的小数部分(即去掉整数天数),再转换为times类型即可得到24小时制时间。可以用%% 1运算符取模,自动去除整数部分。
修改后的代码:
data <- read.table(text=" sleep_time wake_time 23:30:00 03:30:00 23:50:00 06:00:00 00:50:00 07:30:00 00:30:00 06:25:00 00:20:00 06:00:00 23:00:00 06:00:00 00:10:00 05:00:00 ", header=T) wake <- times(data$wake_time) sleep <- times(data$sleep_time) # 调整跨午夜的睡眠时间(加1天) adjusted_sleep <- ifelse(sleep < wake, sleep + 1, sleep) # 计算均值 mean_adjusted <- mean(adjusted_sleep) # 取小数部分转换为24小时制时间 times(mean_adjusted %% 1) # [1] 00:01:25
补充说明
原代码中mean(times(data$sleep_time))得到的10:18:34是错误结果:它直接将午夜前后的时间按线性数值平均,没有考虑到睡眠时间跨午夜的逻辑,因此必须先对跨午夜的睡眠时间加1天调整,再计算均值并转换格式。
内容的提问来源于stack exchange,提问作者user23492854
相关产品推荐
相关产品推荐

