У меня есть данные о времени выполнения в формате mm: ss.00 (т.е. 02: 15,45 или 00: 34,58). R распознает переменную как фактор, но я хотел бы преобразовать каждое время выполнения в несколько секунд (то есть 02: 15,45 - 135,45). Я искал ответ, но не могу найти способ заставить его работать. Спасибо заранее.
Есть ли способ конвертировать мм: сс .00 в секунд .00?
Ответ 1
Использование пакета lubridate (часть tidyverse):
library(lubridate)
period_to_seconds(hms("12:12:54"))
Ответ 2
Здесь я использовал несколько лет. Он тоже векторизован.
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
}
)
)
}
Ответ 3
Посмотрите на strptime. Конкретно
t = "02:15.45"
(as.numeric(as.POSIXct(strptime(t, format = "%M:%OS"))) -
as.numeric(as.POSIXct(strptime("0", format = "%S"))))
Это будет работать, но, возможно, немного неудобно (так делается в основном из-за POSIXct, раздражающего автоматическое преобразование единиц...)
Ответ 4
library(lubridate)
df$variable<- hms(df$variable)
df$variable<- as.numeric(df$variable)
сделать его одним лайнером. Работает как прелесть для меня.
Надеюсь, это поможет.
Ответ 5
Мне не очень удобно, поэтому я не знаю, есть ли встроенная функция, но я разработал этот код.
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 в секунды.
Ответ 6
Вы можете сделать это легко с помощью пакета Lubridate. Если вы используете формат "h: m: s", вы можете преобразовать переменную в объект lubridate с помощью
hms("12:12:54")
И затем преобразуйте его в секундах с помощью
seconds(hms("12:12:54"))
Вот ссылка на статью lubridate в JSS