Вопрос по r – Есть ли способ конвертировать мм: сс.00 в секунд.00?

12

Я получил некоторые данные о времени исполнения в формате mm: ss.00 (то есть 02: 15.45 или 00: 34.58). R распознает переменную как фактор, но я хотел бы преобразовать каждое время исполнения в считанные секунды (то есть с 02: 15.45 до 135.45). Я искал ответ, но, похоже, не могу найти способ заставить его работать. Заранее спасибо.

Если ваша & quot; переменная & quot; (который я имею в виду столбец в кадре данных) действительно фактор, то вам нужно будет использоватьas.character() чтобы получить любой из методов ниже, чтобы преуспеть. 42-

Ваш Ответ

6   ответов
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 и вернет вторые значения. Код может быть легко изменен для преобразования из чч: мм: сс в секунды.

16

Вот тот, который я использовал в течение ряда лет. Это тоже векторизация.

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
         }
      )
   )
}
Error: User Rate Limit Exceeded
8

Посмотри в strptime. конкретно

t = "02:15.45"
(as.numeric(as.POSIXct(strptime(t, format = "%M:%OS"))) - 
    as.numeric(as.POSIXct(strptime("0", format = "%S"))))

Это будет работать, но, возможно, немного неловко (делать это таким образом, в основном из-за надоедливого автоматического преобразования единиц в POSIXct ...)

19

Используя lubridate:

period_to_seconds(hms("12:12:54"))
3
library(lubridate)
df$variable<- hms(df$variable)
df$variable<- as.numeric(df$variable)

сделать его однострочным тоже хорошо. Работает как шарм для меня.
Надеюсь, это поможет.

Error: User Rate Limit Exceeded
0

Вы можете сделать это легко с пакетом Lubridate. Если вы используете формат & quot; h: m: s & quot; вы можете преобразовать переменную в объект lubridate с

hms("12:12:54")

А затем преобразовать его в секунды с

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

Вот ссылка на lubridate статью в JSS

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

Error: User Rate Limit Exceeded

Похожие вопросы