Convertir dd / mm / aa y dd / mm / aaaa a fechas
Tengo un vector de caracteres con fechas en varios formatos como este.
dates <- c("23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Quiero convertir estos a fechas. He probado el muy buen dmy del paquete lubridate, pero esto no funciona:
dmy(dates)
[1] "0012-11-23 UTC" "2012-10-20 UTC" "2012-10-22 UTC" "0012-11-23 UTC"
Se trata el / 12 año como si fuera 0012.
Así que ahora estoy intentando la expresión regular para seleccionar cada tipo y convertir individualmente a fechas usando as.Date (). Sin embargo, la expresión regular que he intentado seleccionar dd / mm / aa solo no funciona.
dates[grep('[0-9]{2}/[0-9]{2}/[0-9]{2,2}', dates)]
devoluciones
[1] "23/11/12" "20/10/2012" "22/10/2012" "23/11/12"
Pensé que el {2,2} debería obtener exactamente 2 números y no todos. No soy muy bueno en la expresión regular por lo que cualquier ayuda será apreciada.
Gracias
EDITAR
Lo que realmente tengo son tres tipos diferentes de fecha como se muestra a continuación
dates <- c("23-Jul-2013", "23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Y quiero convertirlos a fechas.
parse_date_time(dates,c('dmy'))
me da
[1] "2013-07-23" "0012-11-23" "2012-10-20" "2012-10-22" "0012-11-23"
Sin embargo, esto es incorrecto y 0012 debería ser 2012. Me gustaría una solución (bastante simple) para esto.
Una solución que tengo ahora (gracias a @plannapus) es usar expresiones regulares. De hecho, terminé creando esta función, ya que aún estaba recibiendo algunos casos en los que el enfoque de lubricación estaba convirtiendo 12 en 0012.
asDateRegex <- function(dates,
#selects strings from the vector dates using regexes and converts these to Dates
regexes = c('[0-9]{2}/[0-9]{2}/[0-9]{4}', #dd/mm/yyyy
'[0-9]{2}/[0-9]{2}/[0-9]{2}Pero esto no es muy elegante. ¿Alguna solución mejor?
, #dd/mm/yy
'[0-9]{2}-[[:alpha:]]{3}-[0-9]{4}'), #dd-mon-yyyy
orders = 'dmy',
...){
require(lubridate)
new_dates <- as.Date(rep(NA, length(dates)))
for(reg in regexes){
new_dates[grep(reg, dates)] <- as.Date(parse_date_time(dates[grep(reg, dates)], order = orders))
}
new_dates
}
asDateRegex (dates)
[1] "2012-10-20" "2013-07-23" "2012-11-23" "2012-10-22" "2012-11-23"
Pero esto no es muy elegante. ¿Alguna solución mejor?