有没有一种方法可以将mm:ss.00转换为秒.00?

23

我有一些以mm:ss.00格式表示的性能时间数据(例如02:15.45或00:34.58)。R将变量识别为因子,但我想将每个性能时间转换为秒(即02:15.45转换成135.45)。我已经搜索了答案,但似乎找不到解决方法。谢谢。


如果你的“变量”(我理解为数据框中的一列)确实是一个因子,那么你需要使用as.character()才能使下面的任何方法成功。 - IRTFM
6个回答

35

使用lubridate软件包(tidyverse的一部分):

library(lubridate)
period_to_seconds(hms("12:12:54"))

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
         }
      )
   )
}

10
查看 strptime。具体地说:
t = "02:15.45"
(as.numeric(as.POSIXct(strptime(t, format = "%M:%OS"))) - 
    as.numeric(as.POSIXct(strptime("0", format = "%S"))))

这样做是可行的,但可能有点笨拙(主要是因为POSIXct的烦人自动单位转换……)。

7
library(lubridate)
df$variable<- hms(df$variable)
df$variable<- as.numeric(df$variable)

把它变成一行也可以。对我来说非常有效。
希望这可以帮到你。


3
这个主题的最佳答案 - Benoist Laforge

4

我不是很熟悉,不知道是否有内置函数可用,但是我已经想出了这段代码。

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转换为秒。


0

你可以轻松使用Lubridate包实现这个功能。如果你使用“h:m:s”的格式,你可以使用以下代码将变量转换为Lubridate对象:

hms("12:12:54")

然后使用以下代码将其转换为秒:

seconds(hms("12:12:54"))

这里是 JSS 中 lubridate 文章的链接

http://www.jstatsoft.org/v40/i03/paper


这将导致“54S”,这不是期望的结果。问题要求如何将持续时间转换为秒,而不是提取时间对象的秒部分。 - inhuretnakht
使用 period_to_seconds 替换 seconds - Mostafa90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接