我正在尝试对超过24小时的时间值执行计算。在这个简短的例子中,我试图根据他们的就寝时间和唤醒时间来计算某人的睡眠时间。但是,如果就寝时间在午夜之后,则数据将以超过24小时的时间值输入。例如,如果有人在凌晨2点睡觉,他们的就寝时间值是26:00:00。如何在R?中处理超过24小时的时间值?
这是我的简短示例尝试:
library(chron)
bedtime <- c("22:37:34","23:03:32","24:41:23")
waketime <- c("06:41:23","07:25:18","08:47:08")
bedtimeAsTime <- chron(times=bedtime) #results in error
waketimeAsTime <- chron(times=waketime)
#Add 24 hours
waketimeAsTime <- waketimeAsTime + 1
sleepDuration <- waketimeAsTime - bedtimeAsTime
chron函数不接受大于24小时的时间值并将其转换为NA。有关如何处理这个的任何想法?
提前致谢!
答案 0 :(得分:3)
我确定有一个包已经执行此操作,但您可以使用strsplit
和as.numeric
将所有这些时间转换为秒。
ConvertToSeconds <- function(X)
{
X <- strsplit(X, ":")
sapply(X, function(Y) sum(as.numeric(Y) * c(3600, 60, 1)))
}
bedtime <- ConvertToSeconds(bedtime)
waketime <- ConvertToSeconds(waketime) + (86400) #Seconds in 24 hours
sleeptime <- waketime-bedtime
sleeptime
[1] 29029 30106 29145
答案 1 :(得分:1)
你大部分时间都在这里。
我编写了一个名为normTimes
的辅助函数,用于将您的时间转换为大于23的小时数,然后从sleepDuration中减去一个超过一的小时。
require(chron)
bedtime <- c("22:37:34","23:03:32","24:41:23")
waketime <- c("06:41:23","07:25:18","08:47:08")
normTimes <- function(Tt)
{
hourFun <- function(hrs)
{
if(nchar(hrs) == 1)
{
paste0(0, hrs, substr(tt, 3, 8))
} else {
paste0(hrs, substr(tt, 3, 8))
}
}
tt <- Tt[substr(Tt, 1, 2) > 23]
adjt <- as.numeric(substr(tt, 1, 2)) - 23
Tt[substr(Tt, 1, 2) > 23] <- sapply(adjt, hourFun)
return(Tt)
}
bedtime <- normTimes(bedtime)
bedtimeAsTime <- chron(times=bedtime) #no longer results in an error
waketimeAsTime <- chron(times=waketime)
#Add 24 hours
waketimeAsTime <- waketimeAsTime + 1
sleepDuration <- waketimeAsTime - bedtimeAsTime
sleepDuration[sleepDuration > 1] <- sleepDuration[sleepDuration > 1] - 1
(sleepDuration)
[1] 08:03:49 08:21:46 07:05:45
你有它!