Как преобразовать столбец с разными форматами даты в общий формат даты?

Date  
01/01/2013 #mm/dd/yyyy  
12122015 #mmddyyyy  
2014-03-21 #yyyy-mm-dd  
95.10.12 #yy.mm.dd  

У меня есть столбец «Дата» с разными форматами. Как я могу очистить это и преобразовать их в единый формат даты?
Дополнительная информация: class(Date) is factor.


person Ramprakash V    schedule 12.08.2015    source источник
comment
Мы можем использовать library(lubridate) и ?guess_formats   -  person akrun    schedule 12.08.2015
comment
Вы можете использовать foo(parse_date_time(Date, guess_formats(Date, c('dmy', 'ymd')))), где foo из ссылки. и Date <- c('01/01/2013', '12122015', '2014-03-21', '95.10.12')   -  person akrun    schedule 12.08.2015
comment
А также в таких случаях, как 03-03-2013 ... как я могу различать месяц и дату (поскольку они одинаковы) при очистке данных?   -  person Ramprakash V    schedule 12.08.2015
comment
Возможно, вам придется выделить эти особые случаи.   -  person akrun    schedule 12.08.2015
comment
Почти 50-60% моего набора данных имеют значения, которые я упомянул. Итак, как я могу очистить его эффективно ??   -  person Ramprakash V    schedule 12.08.2015
comment
Хорошо, я снова открыл вопрос.   -  person akrun    schedule 12.08.2015
comment
Возможно, будет лучше, если вы опубликуете все возможные случаи в вашем наборе данных.   -  person akrun    schedule 12.08.2015
comment
Эти 5 возможных случаев. Но день и месяц не ясны, так как они представлены однозначными цифрами. Этот тип данных заполняет большую часть моих данных   -  person Ramprakash V    schedule 12.08.2015
comment
У меня есть эвристическая функция, которая угадывает все распространенные форматы, но даже она не может определить мм-дд против дд-мм: см. github.com/eddelbuettel/rcppbdt/blob/master/demo/toPOSIXct.R   -  person Dirk Eddelbuettel    schedule 12.08.2015


Ответы (1)


Самый простой способ сделать это — использовать пакет lubridate.

Date=c( 
   "01/01/2013" #mm/dd/yyyy  
  ,"12122015" #mmddyyyy  
  ,"2014-03-21" #yyyy-mm-dd  
  ,"95.10.12" #yy.mm.dd  
)

library(lubridate)

# list of functions in lubridate that 
# translate text to POSIXct: you only need to know the
# order of the data (e.g. mdy = month-day-year).
funs <- c("mdy","dym","ymd","dmy","myd","ydm")

# vector to store results
dates <- as.POSIXct(rep(NA,length(Date)))

# we try everything lubridate has. There will be some warnings
# e.g. because mdy cannot translate everything. You can ignore this.
for ( f in funs ){
  dates[is.na(dates)] <- do.call(f,list(Date[is.na(dates)]))  
}
dates

> dates
[1] "2013-01-01 01:00:00 CET" "2015-12-12 01:00:00 CET" "2013-01-01 01:00:00 CET" "2015-12-12 01:00:00 CET"
person Community    schedule 12.08.2015