#r
Вопрос:
У меня есть столбец с отметкой времени гонки; журналы времени даются либо в формате ЧЧ:ММ:СС, либо в формате ММ:СС. Мне нужно преобразовать их из символьного формата во временной; Я буду использовать как.POSIXct, но сначала у меня возникли проблемы с наблюдениями, в которых формат MM:SS, а не HH:MM:SS. Когда я применяю as.POSIXct к столбцу, я получаю ошибку, потому что все наблюдения не имеют одинакового формата. Как добавить «00:», приводящее к отметке времени «59:34»?
Время «59:34» «32:07» «1:08:06»
Ответ №1:
Базовый вариант R —
x lt;- c("59:34", "32:07", "1:08:06") as.POSIXct(ifelse(nchar(x) gt; 5, x, paste0('00:', x)), format = '%T', tz = 'UTC') #[1]"2021-11-24 00:59:34 UTC" "2021-11-24 00:32:07 UTC" "2021-11-24 01:08:06 UTC"
Поскольку в данных нет даты as.POSIXct
, добавляется сегодняшняя дата.
Комментарии:
1. Интересный. Я попробовал ту вторую строку, которую вы предоставили здесь. Но без формата и часового пояса. Что делает этот формат?
2.
format
используется для предоставления формата ввода, в котором находятся ваши данные.as.POSIXct
ожидаетYYYY-MM-DD HH:MM:SS
формат, но поскольку наши входные данные в другом формате, нам нужно указать это отдельно.%T
используется, когда у вас есть данные вHH:MM:SS
формате. Более подробная информация о различных форматах в?strptime
.
Ответ №2:
Вот решение с использованием lubridate::hms
. Если вы хотите использовать as.POSIXct
, замените его своим кодом.
Предполагается, что все значения либо MM:SS, либо HH::MM::SS.
ts1
это исходные значения, ts2
предварительно добавленные с «00:», где это необходимо, и ts3
конечные значения.
library(dplyr) library(stringr) library(lubridate) data.frame(ts1 = c("59:34", "32:07", "1:08:06")) %gt;% mutate(ts2 = ifelse(str_count(ts1, ":") == 1, paste0("00:", ts1), ts1), ts3 = hms(ts2))
Результат:
ts1 ts2 ts3 1 59:34 00:59:34 59M 34S 2 32:07 00:32:07 32M 7S 3 1:08:06 1:08:06 1H 8M 6S
Комментарии:
1. У меня небольшая проблема; прошлой ночью код работал просто отлично, но сегодня я получаю эту ошибку: «Ошибка: Проблема с
mutate()
columnts3
. its3 = hms(ts2)
. x Все аргументы должны быть числовыми или NA»2. пушка Тим) %gt;% мутировать(ts2 = ifelse(str_count(ts1, «:») == 1, paste0(«00:», ts1), ts1), ts3 = hms(ts2)) gt;lt;lt; Тим-мой временной вектор.
3. Нужно было бы просмотреть данные,
gun
чтобы помочь. Код работает с примерами данных в вопросе.