2010-11-30 51 views
10

Soy relativamente nuevo en R, pero esta es la primera vez que tengo que lidiar con conversiones de fecha. Leí en mis datos desde un archivo CSV (usando read.table()), pero hice un cortocircuito con los datos para resaltar mi problema. Cuando se lee en R, el campo de Fecha es el carácter.Convertir carácter a fecha en R

Simplemente, la mayoría de mis fechas son coaccionadas correctamente, excepto en algunas instancias. El siguiente ejemplo con suerte te mostrará lo que está sucediendo.

# my attempt to coerce the date -- uses the stringr package 
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
       str_locate(prods.all$Date, " ")[1]-1), 
       "%m/%d/%Y") 

# grab two rows to highlight my issue 
temp <- prods.all[c(1925:1926), c(1,8)] 

> temp 
        Date  Date2 
1925 10/9/2009 0:00:00 2009-10-09 
1926 10/15/2009 0:00:00 0200-10-15 

Como puede ver, el año de algunas de las fechas es inexacto. El patrón parece ocurrir cuando el día es de dos dígitos.

He revisado un par de libros y he intentado con Google de una mejor manera, pero todo parece indicar que mis datos no están formateados correctamente en la entrada.

Dado lo poderoso que es R, creo que hay una manera muy fácil de forzar a mi columna a ser fechas válidas y que estoy pasando por alto una solución muy obvia.

Cualquier ayuda que pueda proporcionar será muy apreciada.

+0

La razón por la que está recibiendo la inválido La fecha 0200 es que las duraciones de los caracteres del día son diferentes (dos dígitos para el 15-oct, un dígito para el 9-oct), y el código sustituto de la secuencia no es responsable de eso. En cualquier caso, probablemente pueda usar como. Fecha o tiempo de respuesta directamente con el formato de atributo, sin procesar los caracteres aún más. – mdsumner

Respuesta

24

Puede estar complicando demasiado las cosas, ¿hay alguna razón por la que necesita el paquete stringr?

df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00")) 
as.Date(df$Date, "%m/%d/%Y %H:%M:%S") 

[1] "2009-10-09" "2009-10-15"

más general y si se necesita el componente de tiempo, así, el uso strptime:

strptime(df$Date, "%m/%d/%Y %H:%M:%S") 

Estoy adivinando qué aspecto podrían tener tus datos reales a partir de los resultados parciales que das.

+0

Advertiría contra 'strptime' porque devuelve un objeto' POSIXlt', que tiende a encajar a los nuevos usuarios porque no se dan cuenta de que se trata de una lista. Si necesita tiempo, use 'as.POSIXct' pero tenga cuidado si sus" fechas "son realmente factores ... –

+1

verdadero, pero desde R 2.11.0" length () ahora devuelve la longitud del correspondiente vector de fecha y hora abstracto en lugar de siempre 9 (la longitud de la estructura de la lista subyacente). (Deseo de PR # 14073 y PR # 10507.) "así que me preguntaba si valía la pena complicar las cosas. Usted puede simplemente como. POSIXct (strptime (x)) de todos modos. – mdsumner

+0

No me di cuenta de eso. Gracias por el puntero. Aunque me pregunto si todavía podría ser confuso si tienes una columna 'POSIXlt' en' data.frame' ... –

30

La forma más sencilla es utilizar lubridate:

library(lubridate) 
prods.all$Date2 <- mdy(prods.all$Date2) 

Esta función devuelve automáticamente los objetos de la clase POSIXct y trabajará con cualquiera de los factores o caracteres.

+5

Mencionaré la existencia de cosas como ymd(), ymd_hms(), myd_hms(), etc. en esa biblioteca para manejar los campos de fecha y hora juntos. Awesome library por cierto. Mis felicitaciones para ti ... –

-1

library(lubridate) si su formato de fecha es como esto '04/24/2017 05: 35: 00'then cambiarlo, como a continuación prods.all$Date2<-gsub("/","-",prods.all$Date2) continuación, cambiar el formato de fecha parse_date_time(prods.all$Date2, orders="mdy hms")