You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:12:11