Convertir caracteres hasta la fecha en R
Pregunta
Soy relativamente nuevo en R, pero esta es la primera vez que he tenido que tratar con conversiones de fecha. He leído en mis datos en un archivo CSV (usando read.table ()), pero en cortocircuito los datos para destacar mi problema. Cuando se lee en I, el campo Fecha es el carácter.
Simplemente, la mayoría de las fechas conseguir coaccionado correctamente, a excepción de algunos casos. El siguiente ejemplo se espera que muestre lo que está pasando.
# 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 se puede ver, el año de algunas de las fechas está incorrecto. El patrón parece ocurrir cuando el día es de dos dígitos.
He mirado a través de un par de libros y trató de Google de una manera mejor, pero todo parece sugerir que mis datos no tienen el formato correcto en la entrada.
Teniendo en cuenta lo poderoso que R es, me figura que hay una manera muy fácil de forzar mi columna para ser fechas válidas y que estoy pasando por alto una solución muy obvia.
Cualquier ayuda que puede proporcionar será muy apreciada.
Solución
Se le puede complicar las cosas, ¿hay alguna razón se 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"
De forma más general y si se necesita el componente de tiempo, así, el uso strptime:
strptime(df$Date, "%m/%d/%Y %H:%M:%S")
supongo lo que sus datos reales podrían mirar a partir de los resultados parciales que das.
Otros consejos
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 POSIXct
clase y trabajará con cualquiera de los factores o caracteres.
library(lubridate)
si el formato de fecha es como esto '04 / 24/2017 05: 35: cambio 00'then se siente más adelante
prods.all$Date2<-gsub("/","-",prods.all$Date2)
a continuación, cambiar el formato de fecha
parse_date_time(prods.all$Date2, orders="mdy hms")