R Преобразование в актуальное из нескольких форматов

Мне нужно преобразовать строку дат в нескольких форматах в допустимые даты.

e.g.

dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001", "20161101")

> as.Date(dates, format=c("%m-%d-%Y","%Y%m%d"))
[1] "2017-01-01" NA           "2016-12-01" "2016-09-01" NA           "2016-11-01"

две даты отображаются как NA


person user3357059    schedule 12.04.2017    source источник


Ответы (2)


Примерно так я написал пакет в любое время для:

R> dates <- c("01-01-2017","02-01-2017","12-01-2016","20160901","20161001", 
+             "20161101")
R> library(anytime)
R> anydate(dates)
[1] "2017-01-01" "2017-02-01" "2016-12-01" "2016-09-01" 
[5] "2016-10-01" "2016-11-01"
R> 

Анализируйте любой здоровый ввод надежно и без явного формата или происхождения или другого линейного шума.

При этом не начинать стиль ISO с годом означает потенциальные проблемы, поэтому 02-03-2017 может быть 3 февраля или 2 марта. Я следую североамериканскому соглашению, которое я тоже считаю несколько нарушенным, но оно так чертовски распространено. Сделайте себе одолжение и постарайтесь ограничить входные данные датами ISO, по крайней мере, в порядке ISO YYYYMMDD.

person Dirk Eddelbuettel    schedule 12.04.2017
comment
Чтобы уточнить, anydate() отдает приоритет mdy над dmy? - person thelatemail; 13.04.2017
comment
Да. Просмотрите форматы, которые вы также можете перечислить изнутри. - person Dirk Eddelbuettel; 13.04.2017
comment
Я обнаружил, что это немного быстрее as.Date(ifelse(grepl("-", dates), as.Date(dates, format = c("%m-%d-%Y")), as.Date(dates, format = c("%Y%m%d"))), origin = "1970-01-01") - person user3357059; 19.04.2017
comment
Есть ли способ просто изменить происхождение? Я нахожу эту функцию действительно полезной, но мне нужно изменить источник при работе с целым числом на 1899-12-30 из-за Excel. - person Croote; 06.05.2020
comment
Привет, @Croote. Думаю можно. Мы используем его как константу времени компиляции, и я полагаю, мы могли бы изменить его. С совершенно новым уровнем тестирования, поэтому есть «стоимость». Может быть проще написать локальный fromExcel() хелпер. Если вы хотите продолжить, откройте заявку на выпуск с некоторыми примерами данных/ - person Dirk Eddelbuettel; 06.05.2020
comment
Привет, спасибо, я думаю, я мог бы просто сделать это. В моей компании мы постоянно извлекаем данные клиента из Excel. - person Croote; 07.05.2020

Я пробовал библиотеку (в любое время), однако для больших данных это не сработало. Затем я нашел полезной эту последовательность:

df$Date2 <- format(as.Date(df$Date, format="%m/%d/%Y"), "%d/%m/%y")

df$Date2 <- as.Date(df$Date2,"%d/%m/%y")

У меня работало до "10.08.2005", а также "13.08.05" в той же колонке.

person Henrique L.R.    schedule 11.05.2020