我是R统计软件的新手,我在这个过程中烤咖啡并记录不同的事件。在烘焙过程之后,我想使用R进行一些计算和分析,并通过查找事件之间的时间跨度来推导期间的重要持续时间 - 例如:
(如果您是咖啡爱好者,并希望了解有关咖啡烘焙参数的更多信息:https://coffee-mind.com/profile/)
我可以如何/以何种格式存储这些事件并计算事件之间的时间间隔?我想在MM:SS中显示时间跨度,但也要看MM:SS期间的总秒数。我一直在寻找不同的包(如chron和lubridate),但他们似乎都关注时区,绝对日期等等,我只对分钟和秒钟感兴趣(无论日期和时区 - 不是很有趣在这里)以及如何对这些记录的事件进行简单的减法计算。 我对“如何编写代码”感兴趣,但是对于已经为此设计的函数(如chron和lubridate)以及如何直接使用它们感兴趣(我还假设这个社区最常用的方法是什么?)
答案 0 :(得分:5)
lubridate
提供您需要的功能。除了包含日期和时间的POSIXct
类之外,它还为持续时间提供了类period
。您可以将%M:%S
格式的时间转换为period
,如下所示:
library(lubridate)
times <- c("00:00", "05:10", "07:15", "09:00", "11:30")
ms(times)
## [1] "0S" "5M 10S" "7M 15S" "9M 0S" "11M 30S"
然后,您可以使用as.period()
转换为您想要的时间单位:
as.period(ms(times), unit = "sec")
## [1] "0S" "310S" "435S" "540S" "690S"
如果您现在转换为数字,您将得到秒数作为数字:
seconds <- as.numeric(as.period(ms(times), unit = "sec"))
seconds
## [1] 0 310 435 540 690
现在可以使用diff()
:
diff(seconds)
##[1] 310 125 105 150
请注意,其他格式的函数ms()
还有其他变体:hm()
(%H:%M:%S)和hms()
(%H:%M )。
答案 1 :(得分:1)
我不确定这是否有帮助,但是当我需要将youtube视频的时间跨度转换为秒时,我才能使用此功能。它们被格式化为hh:mm:ss所以当你输入一个像你的例子那样的向量时它可以为你工作
toseconds<-function(x){
sec<-rep(NA,length(x))
minu<-rep(NA,length(x))
hodina<-rep(NA,length(x))
total<-rep(NA,length(x))
for (i in 1:length(x)) {
if (str_count(x[i],":")==2) {
sec[i]<-as.numeric(str_sub(str_replace(x[i],":",""),str_locate(str_replace(x[i],":",""),":")[ ,1]+1))
minu[i]<-as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1,str_locate(x[i],":")[ ,1]+2))
hodina[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1))
} else {
sec[i]<- as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1))
minu[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1))
hodina[i]<-0
}
total[i]<-hodina[i]*3600+minu[i]*60+sec[i]
}
total
}
答案 2 :(得分:0)
避免加载其他库...
MinSeg=function(fim, ini){
dif=as.numeric(difftime(fim, ini, units='min'))
return(paste0(sprintf('%02d', as.integer(dif)), ":"
,sprintf('%02.0f', (dif-as.integer(dif))*60)))
}
ini=Sys.time()
fim=Sys.time()
MinSeg(fim,ini)
[1] "00:03"