首页 > 解决方案 > 在R中找到时间之间的差异

问题描述

我想计算“A”和“B”的 R 时间差。我拥有的数据是个人入睡时的小时/分钟/上午-下午(“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)。然后,我创建了另一个带有“假”日期的列(如果是下午:“2019-04-13”和“2019-04-14”)。然后,我再次使用函数 unite() 来加入日期和时间,并使用函数 strptime() 将类更改为时间。

对于 hour(B)、min(B) 和 AMPM(B),我还使用了函数 unite 和 join 三列。然后我应用函数 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

标签: rtimedifference

解决方案


我们可以paste用来组装时间(A)和时间(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")

推荐阅读