Часы:Минуты:От секунд до секунд

Я пытаюсь преобразовать длинный список значений в столбце из часов: минут: секунд в секунды. Приведенный ниже код работает нормально, пока значения находятся в формате H:M:S, но у меня есть значения в случайных строках только в формате M:S (поэтому нет часов). Когда я пытаюсь выполнить для них приведенный ниже код, я, очевидно, получаю NA для каждого из этих значений. Есть ли способ, которым я могу искать только значения в формате M:S и только в формате H:M:S и конвертировать их отдельно? Нужно ли мне добавлять значение часов в каждое из значений M:S, чтобы я мог конвертировать все сразу? Мой код ниже:

as.numeric(strptime(df$x, format="%H:%M:%S") - as.POSIXct(format(Sys.Date())), units="secs")

Example of data:
    Time
    12:22:05
    42:44

Example of data after running above:
    Time
    44525
    NA

person coderX    schedule 07.09.2017    source источник


Ответы (2)


Попробуйте parse_date_time при использовании пакета lubridate.

df$time <- parse_date_time(x = df$time, c("HMS","MS"))
person D.sen    schedule 07.09.2017
comment
К вашему сведению, цель - количество секунд, прошедших с полуночи (очевидно, благодаря редактированию ОП только что). - person Frank; 07.09.2017
comment
Спасибо, я считаю, что это должно сработать. Приму ответ, как только запущу! На самом деле я ищу просто преобразование H: M: S в S, а не просто секунды с полуночи. У меня есть несколько значений, которые имеют часы выше 24, поэтому, учитывая метод, который я использовал ранее, эти значения не будут работать слишком хорошо. - person coderX; 07.09.2017
comment
lubridate имеет функцию period_to_seconds, которая принимает время и возвращает количество секунд в дне, которое она представляет. Я немного смущен тем, почему у вас есть значения времени, превышающие 24... это не время, а продолжительность? - person D.sen; 09.09.2017

Ваше предложение добавить значение часов в формат M:S также кажется довольно простым в реализации:

x = c("12:22:05", "42:44")
x[nchar(x)<8] <- paste0("00:", x[nchar(x)<8])
as.numeric(strptime(x, format="%H:%M:%S") - as.POSIXct(format(Sys.Date())), units="secs")
## 44525  2564
person Gilles    schedule 07.09.2017