Корректировка формата времени в R

#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() column ts3 . i ts3 = hms(ts2) . x Все аргументы должны быть числовыми или NA»

2. пушка Тим) %gt;% мутировать(ts2 = ifelse(str_count(ts1, «:») == 1, paste0(«00:», ts1), ts1), ts3 = hms(ts2)) gt;lt;lt; Тим-мой временной вектор.

3. Нужно было бы просмотреть данные, gun чтобы помочь. Код работает с примерами данных в вопросе.