r - 在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
解决方案
我们可以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")
推荐阅读
- java - 来自另一个项目时不显示终端输出
- android - 如何在 pushNotification react-native 中设置用户定义时间
- python - 多个 numpy 2d 数组的元素乘法
- python - 如何使用 coinbase API 将 BTC 转换为 ETH?
- excel - 如何让 Excel Autofilter 的勾选和取消勾选过程更简单?
- hyperledger-fabric - 为什么我的调用命令第一次返回超时,第二次成功
- python-3.x - 当表中有插入时启动python脚本,当表中有列更新时停止脚本
- claims - 如何执行索赔天才 API 身份验证
- php - 将上传的文件转换为 pdf 并将其内容传递给另一个 api
- sql-server - 导出为 CSV ,自定义选择语句