R中的分秒计算
Calculations with minutes and seconds in R
我是 R 统计软件的新手,我烘焙咖啡并记录过程中的不同事件。在烘焙过程之后,我想使用 R 进行一些计算和分析,并通过查找事件之间的时间跨度来推导出该期间的重要持续时间 - 例如:
- 00:00 开始
- 05:10 黄色
- 07:15 肉桂
- 09:00 一爆
- 11:30 烘焙过程结束
(如果你是咖啡达人,想了解更多咖啡烘焙参数: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"
我是 R 统计软件的新手,我烘焙咖啡并记录过程中的不同事件。在烘焙过程之后,我想使用 R 进行一些计算和分析,并通过查找事件之间的时间跨度来推导出该期间的重要持续时间 - 例如:
- 00:00 开始
- 05:10 黄色
- 07:15 肉桂
- 09:00 一爆
- 11:30 烘焙过程结束
(如果你是咖啡达人,想了解更多咖啡烘焙参数: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"