用R中的分钟和秒计算

时间:2016-05-29 06:28:53

标签: r time duration seconds

我是R统计软件的新手,我在这个过程中烤咖啡并记录不同的事件。在烘焙过程之后,我想使用R进行一些计算和分析,并通过查找事件之间的时间跨度来推导期间的重要持续时间 - 例如:

  • 00:00开始
  • 05:10黄色
  • 07:15 Cinnamon
  • 09:00 First Crack
  • 11:30烘焙过程结束

(如果您是咖啡爱好者,并希望了解有关咖啡烘焙参数的更多信息:https://coffee-mind.com/profile/

我可以如何/以何种格式存储这些事件并计算事件之间的时间间隔?我想在MM:SS中显示时间跨度,但也要看MM:SS期间的总秒数。我一直在寻找不同的包(如chron和lubridate),但他们似乎都关注时区,绝对日期等等,我只对分钟和秒钟感兴趣(无论日期和时区 - 不是很有趣在这里)以及如何对这些记录的事件进行简单的减法计算。 我对“如何编写代码”感兴趣,但是对于已经为此设计的函数(如chron和lubridate)以及如何直接使用它们感兴趣(我还假设这个社区最常用的方法是什么?)

3 个答案:

答案 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"