首页 > 解决方案 > R中的减法时间

问题描述

我想计算一个人晚上在床上花费的时间。第一列,j1bed(睡觉时间):

dput(head(subscales$j1bed, 20))

c("23:00:00", "01:00:00", "22:00:00", "00:00:00", "00:00:00", 
"23:00:00", "03:00:00", "23:00:00", "22:00:00", "23:00:00", "21:00:00", 
"23:30:00", "22:00:00", "22:00:00", "20:00:00", "22:00:00", "22:00:00", 
"21:00:00", "20:00:00", "23:00:00")

第二列,j3wake(时间唤醒):

dput(head(subscales$j3wake, 20))

c("08:00:00", "08:00:00", "05:00:00", "08:00:00", "07:00:00", 
"07:00:00", "09:00:00", "09:00:00", "08:00:00", "06:00:00", "03:00:00", 
"08:30:00", "07:00:00", "08:00:00", "09:00:00", "07:00:00", "06:00:00", 
"07:00:00", "07:00:00", "12:00:00")

我的代码目前如下:

Hours_in_Bed<- as.numeric(difftime(strptime(subscales$j3wake, "%I:%M %p" ),strptime(subscales$j1bed, "%I:%M %p" ),units='hours'))

出于某种原因,这只是提出了“NA”。有任何想法吗?

编辑:我尝试了以下三个建议:1)

result1<-strptime(subscales$j3wake, "%I:%M %p")

result2<-strptime(subscales$j1bed, "%I:%M %p")

Hours_in_Bed<-as.numeric(difftime(result2, result1, units='hours'))

这仅产生“NA”。2)

 subscales$j3wake1=as.POSIXct(paste('1970-1-1',subscales$j3wake))
subscales$j1bed1 =as.POSIXct(paste('1970-1-1',subscales$j1bed))
as.numeric(difftime(subscales$j1bed1,subscales$j3wake1,units='hours'))

这产生“0”。3)

 all(grepl("[0-9]{2}:[0-9]{2} (AM|PM)", subscales$j3wake)) 

all(grepl("[0-9]{2}:[0-9]{2} (AM|PM)", subscales$j1bed))

两者都产生“错误”。

编辑 2:最后一个提示是关键!我想我应该改用“%H:%M”:

Hours_in_Bed<- as.numeric(difftime(strptime(subscales$j3wake, "%H:%M" ),strptime(subscales$j1bed, "%H:%M" ),units='hours'))

如果我这样做:

Hours_in_Bed[!is.na(Hours_in_Bed) & Hours_in_Bed<0] <- 24 + Hours_in_Bed[!is.na(Hours_in_Bed) & Hours_in_Bed<0] 

我应该可以走了。让我知道我是否仍然关闭,并感谢您的帮助!

标签: r

解决方案


即使没有任何真正的年/月/日,通常也更容易使用 POSIXct 类型。例子:

subscales$j3wake1 = as.POSIXct(paste('1970-1-1',subscales$j3wake))
subscales$j1bed1 = as.POSIXct(paste('1970-1-1',subscales$j1bed))
as.numeric(difftime(subscales$j1bed1,subscales$j3wake1,units='hours'))

推荐阅读