我有一些 mm:ss.00 格式的性能时间数据(即 02:15.45 或 00:34.58)。R 将变量识别为一个因素,但我想将每个性能时间转换为几秒钟(即 02:15.45 到 135.45)。我一直在寻找答案,但似乎找不到让它工作的方法。提前致谢。
问问题
19675 次
6 回答
31
使用 lubridate 包(tidyverse 的一部分):
library(lubridate)
period_to_seconds(hms("12:12:54"))
于 2015-07-21T21:20:47.030 回答
19
这是我用了很多年的一个。它也是矢量化的。
toSeconds <- function(x){
if (!is.character(x)) stop("x must be a character string of the form H:M:S")
if (length(x)<=0)return(x)
unlist(
lapply(x,
function(i){
i <- as.numeric(strsplit(i,':',fixed=TRUE)[[1]])
if (length(i) == 3)
i[1]*3600 + i[2]*60 + i[3]
else if (length(i) == 2)
i[1]*60 + i[2]
else if (length(i) == 1)
i[1]
}
)
)
}
反之(将小数秒保留为请求的位数:
secondsToString <- function(x,digits=2){
unlist(
lapply(x,
function(i){
# fractional seconds
fs <- as.integer(round((i - round(i))*(10^digits)))
fmt <- ''
if (i >= 3600)
fmt <- '%H:%M:%S'
else if (i >= 60)
fmt <- '%M:%S'
else
fmt <- '%OS'
i <- format(as.POSIXct(strptime("0:0:0","%H:%M:%S")) + i, format=fmt)
if (fs > 0)
sub('[0]+$','',paste(i,fs,sep='.'))
else
i
}
)
)
}
于 2012-05-31T15:17:23.730 回答
10
查看strptime。具体来说
t = "02:15.45"
(as.numeric(as.POSIXct(strptime(t, format = "%M:%OS"))) -
as.numeric(as.POSIXct(strptime("0", format = "%S"))))
这会起作用,但可能有点尴尬(这样做主要是因为 POSIXct 烦人的自动单位转换......)
于 2012-05-31T14:56:27.053 回答
6
library(lubridate)
df$variable<- hms(df$variable)
df$variable<- as.numeric(df$variable)
使它成为单线也可以。对我来说就像一个魅力。
我希望这有帮助。
于 2017-03-16T07:40:41.730 回答
3
我不太舒服,所以我不知道是否有任何可用的内置函数,但我已经制定了这段代码。
mmss_to_ss <- function (string)
{
mmss <- strsplit (string, ":", T)
mm <- as.numeric (mmss[[1]][1])
ss <- as.numeric (mmss[[1]][2])
return (mm * 60 + ss)
}
这将接受 mm:ss 格式的时间字符串并返回秒值。可以轻松修改代码以从 hh:mm:ss 转换为秒。
于 2012-05-31T15:06:57.570 回答
0
您可以使用 Lubridate 包轻松完成此操作。如果您使用格式“h:m:s”,您可以将变量转换为 lubridate 对象
hms("12:12:54")
然后将其转换为秒
seconds(hms("12:12:54"))
这是 JSS 中 lubridate 文章的链接
于 2012-05-31T16:43:23.310 回答