R中的分秒计算

Calculations with minutes and seconds in R

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

(如果你是咖啡达人,想了解更多咖啡烘焙参数:https://coffee-mind.com/profile/)

How/what 格式我可以存储这些事件并计算事件之间的时间跨度吗?我想显示 MM:SS 中的时间跨度,但也想查看 MM:SS 期间的总秒数。我一直在查看不同的包(如 chron 和 lubridate),但它们似乎都与时区、绝对日期等有关,而我只对分钟和秒感兴趣(不管日期和时区——没意思在这里)以及如何对这些记录的事件进行简单的减法计算。 我对 'how to write the code' 不感兴趣,但对已经为此设计的函数(如 chron 和 lubridate)以及如何直接使用它们感兴趣(我还认为这是这个社区最普遍有趣的方法?)

我不确定这是否有帮助,但当我需要将 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
}

lubridate 提供您需要的功能。除了包含日期和时间的 POSIXct class 之外,它还提供 class 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).

避免加载另一个库...

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"