Преобразование большого столбца данных строки в дату и время - необъяснимое поведение

У меня есть файл, содержащий информацию о дате и времени в виде строки символов. Я хочу преобразовать его в объект POSIXlt даты и времени, и для этого я использую базовую функцию strftime() в R.

Хотя команда работает нормально, когда я передаю ей строку символов или когда я применяю ее к небольшому фрагменту кадра данных, когда я применяю ее к большему фрагменту или ко всему массиву данных, она не может захватить час. Пожалуйста, смотрите ниже:

d = "2017-11-18 01:00:00"
t = strftime(d, format = "%Y-%m-%d %H:%M")
t
'2017-11-18 01:00'

head(data %>% dplyr::slice(1:1000) %>% mutate(DateTime1 = strftime(DateTime, format = "%Y-%m-%d %H:%M")))
DateTime    Junction    Vehicles    ID  DateTime1
2015-11-01 00:00:00 1   15  20151101001 2015-11-01 00:00
2015-11-01 01:00:00 1   13  20151101011 2015-11-01 01:00
2015-11-01 02:00:00 1   10  20151101021 2015-11-01 02:00
2015-11-01 03:00:00 1   7   20151101031 2015-11-01 03:00
2015-11-01 04:00:00 1   9   20151101041 2015-11-01 04:00
2015-11-01 05:00:00 1   6   20151101051 2015-11-01 05:00

head(data %>% mutate(DateTime1 = strftime(DateTime, format = "%Y-%m-%d %H:%M")))
DateTime    Junction    Vehicles    ID  DateTime1
2015-11-01 00:00:00 1   15  20151101001 2015-11-01 00:00
2015-11-01 01:00:00 1   13  20151101011 2015-11-01 00:00
2015-11-01 02:00:00 1   10  20151101021 2015-11-01 00:00
2015-11-01 03:00:00 1   7   20151101031 2015-11-01 00:00
2015-11-01 04:00:00 1   9   20151101041 2015-11-01 00:00
2015-11-01 05:00:00 1   6   20151101051 2015-11-01 00:00

Как объяснить это неустойчивое поведение и как преобразовать столбец даты и времени для всего набора данных?

Ваш совет будет оценен.


person rf7    schedule 18.11.2017    source источник
comment
Распечатать строки в кадре данных   -  person skrubber    schedule 18.11.2017
comment
Используйте dput() для печати структуры и содержимого вашего набора данных.   -  person Martin Schmelzer    schedule 18.11.2017
comment
Вы пытались вместо этого использовать функции смазки? Например: данные %›% mutate(DateTime1 = lubridate::ymd_hms(DateTime)).   -  person Peter K    schedule 18.11.2017
comment
Вы говорите, что тип data$DateTime является строкой? Вы когда-нибудь получали воспроизводимый пример? Как правило, проблемы возникают из-за отсутствия, неполного или лишнего текста, такого как часовой пояс, миллисекунды и т. д. В любом случае, сторонние библиотеки дат, такие как lubridate, более отказоустойчивы.   -  person smci    schedule 21.05.2018
comment
И когда вы говорите У меня есть файл, содержащий информацию о дате и времени, вы не показали нам read.csv() или любую другую команду, которую вы использовали для преобразования его в фрейм данных, который вы нам показываете, или dput() на этом кадр данных. Я полагаю, у вас было stringsAsFactors = FALSE   -  person smci    schedule 21.05.2018


Ответы (1)


Я не могу точно сказать, но может быть какая-то несогласованность в вашей переменной DateTime. Поскольку это похоже на символьную переменную, когда векторизованная версия вашего преобразования обнаружит неожиданное поведение, она не справится с этим, потому что одно и то же преобразование применяется к каждой записи (он будет использовать формат, который работает во всех случаях), это, вероятно, причина, по которой он работал в срезе. Я бы предложил либо постепенно увеличивать размер среза, чтобы отслеживать, где появляется несоответствие (может быть более разумный способ проверить это).

Еще одно замечание заключается в том, что strftime требует, чтобы его первый аргумент был конвертируемым в POSIXlt, поэтому я бы рекомендовал передавать объект POSIXlt, чтобы ваша функция не выбирала, как преобразовать исходную строку. Вы можете использовать, например:

t = strftime(strptime(d, format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M")

Затем, надеюсь, при преобразовании вашей символьной переменной в POSIXlt так, как вы ожидаете, через strptime, она выдаст ошибку из-за несогласованных строк.

Третьим, но не таким хорошим решением было бы использование rowwise(), что будет преобразовывать каждую строку отдельно, создавая ожидаемые результаты, за исключением несоответствий (будет искать соответствующий формат в каждой строке, а не один формат, который работает для всех).

person Freguglia    schedule 18.11.2017