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

#r #lubridate

Вопрос:

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

например

 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

Ответ №1:

В значительной степени я написал пакет anytime для:

 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 ГГГГММДД.

Комментарии:

1. Чтобы уточнить, anydate() имеет ли приоритет mdy над dmy?

2. Да. Смотрите форматы , которые вы также можете перечислить изнутри.

3. Я обнаружил, что это немного быстрее 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")

4. Есть ли какой-нибудь способ просто изменить источник? Я нахожу эту функцию действительно полезной, но мне нужно изменить начало координат при работе с целым числом на «1899-12-30» из-за Excel.

5. Привет @Croote, я думаю , можно было бы. Мы используем его как константу времени компиляции, и мы могли бы, я полагаю, изменить его. С совершенно новым уровнем тестирования, поэтому есть «стоимость». Может быть проще написать локальный fromExcel() помощник. Если вы хотите продолжить, откройте запрос на выпуск с некоторыми образцами данных/

Ответ №2:

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

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

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

Для меня это сработало с «8/10/2005», а также «08/13/05» в том же столбце.