找出R

时间:2019-05-14 18:59:20

标签: r time difference

我想计算R中的“ A”和“ B”的时差。我掌握的数据是个人入睡时的小时/分钟/上午-下午(“ A”)以及他们何时醒来(“ B”):( df称为时间)

    Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B)
    1       30     AM      7       30     AM
    4       00     AM      9       00     AM
    11      30     PM      6       30     AM 

我一直在做一些研究,发现我可以将时间创建为角色,然后将其更改为时间。

首先,我使用unite()函数(tidyverse)将hour(A)和min(A)连接起来。然后,我创建了另一个带有``假''日期的列(如果它是pm:“ 2019-04-13”&am“ 2019-04-14”)。然后,我再次使用unite()函数连接日期和时间,并使用strptime()函数将类更改为time。

对于小时(B),分钟(B)和AMPM(B),我还使用了unite函数并将三列连接起来。然后,我应用函数strptime()将类更改为时间。

最后,我正在使用difftime()函数来查找A和B之间的差异,但是我不明白为什么会得到异常的结果。


time <- time %>% mutate(Date = ifelse(AMPM(A) == "  AM", "2019-04-14", "2019-04-13"))

time$Date <- as.Date(time$Date)

#Using unite to join Hour(A) with Mins(A) and Hour(B) with Mins(B)
time <- time %>% unite(Sleeptime,HourA,MinsA, sep = ":") %>% unite(Wakeuptime, HourB,MinsB, sep = ":") 

#Adding the seconds 
time$Sleeptime <- paste0(time$Sleeptime,":00")

#Using unite to join Hours(B)Mins(B) with AMPM(B)
time <- time %>% unite(Wakeuptime, Wakeuptime ,AMPMWake, sep = "" )

#Changing the class for time (B)
time$Wakeuptime2 <- strptime(x = paste0(time$Wakeuptime2, "m"), format = "%I:%M %p")

#Joining the fake date for (A) with the time(A)
time <- time %>% unite(ST, Date, Sleeptime, sep = " ")

#Changing the class for time (A)
time$ST = strptime(time$ST,format='%Y-%m-%d %H:%M:%S')

#Calculating the difference in time 
time$difference <- difftime(time$Wakeuptime2, time$ST, units = "hours")

我需要的是另一列时间或分钟有所不同的列

    Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF (min)
    1       30     AM      7       30     AM      300
    4       00     AM      9       00     AM      300
    11      30     PM      6       30     AM      420

1 个答案:

答案 0 :(得分:0)

我们可以使用paste来组装time(A)和time(B)的片段,然后转换as.POSIXct。从PM的就寝时间中减去8.64e4(以秒为单位的一天)。现在,很容易计算apply中的差异。

tmp <- sapply(list(1:3, 4:6), function(x) {
  cl <- as.POSIXct(apply(time[x], 1, paste, collapse=":"), format="%I:%M:%p")
  return(ifelse(time[tail(x, 1)] == "PM", cl - 8.64e4, cl))
  })
time <- cbind(time, `DIFF(min)`=apply(tmp, 1, diff)/60)
time
#   Hour(A) Min(A) AMPM(A) Hour(B) Min(B) AMPM(B) DIFF(min)
# 1       1     30      AM       7     30      AM       360
# 2       4      0      AM       9      0      AM       300
# 3      11     30      PM       6     30      AM       420

数据

time <- structure(list(`Hour(A)` = c(1L, 4L, 11L), `Min(A)` = c(30L, 
0L, 30L), `AMPM(A)` = c("AM", "AM", "PM"), `Hour(B)` = c(7L, 
9L, 6L), `Min(B)` = c(30L, 0L, 30L), `AMPM(B)` = c("AM", "AM", 
"AM")), row.names = c(NA, -3L), class = "data.frame")