r date read.table read.csv

Especifique el formato de fecha personalizado para el argumento colClasses en read.table/read.csv



date (3)

En caso de que necesite tiempo también:

setClass(''yyyymmdd-hhmmss'') setAs("character","yyyymmdd-hhmmss", function(from) as.POSIXct(from, format="%Y%m%d-%H%M%S")) d <- read.table(colClasses="yyyymmdd-hhmmss", text="20150711-130153") str(d) ## ''data.frame'': 1 obs. of 1 variable: ## $ V1: POSIXct, format: "2015-07-11 13:01:53"

Pregunta:

¿Hay alguna manera de especificar el formato de fecha cuando se utiliza el argumento colClasses en read.table / read.csv?

(Me doy cuenta de que puedo convertir después de la importación, pero con muchas columnas de fecha como esta, sería más fácil hacerlo en el paso de importación)

Ejemplo:

Tengo un .csv con columnas de fecha en el formato %d/%m/%Y

dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date"))

Esto hace que la conversión sea incorrecta. Por ejemplo, 15/07/2008 convierte en 0015-07-20 .

Código reproducible:

data <- structure(list(func_loc = structure(c(1L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L), .Label = c("3076WAG0003", "3076WAG0004", "3076WAG0007", "3076WAG0009", "3076WAG0010"), class = "factor"), order_type = structure(c(3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 1L), .Label = c("PM01", "PM02", "PM03"), class = "factor"), actual_finish = structure(c(4L, 6L, 1L, 2L, 3L, 7L, 1L, 8L, 1L, 5L), .Label = c("", "11/03/2008", "14/08/2008", "15/07/2008", "17/03/2008", "19/01/2009", "22/09/2008", "6/09/2007"), class = "factor")), .Names = c("func_loc", "order_type", "actual_finish"), row.names = c(NA, 10L), class = "data.frame") write.csv(data,"data.csv", row.names = F) dataImport <- read.csv("data.csv") str(dataImport) dataImport dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date")) str(dataImport) dataImport

Y así es como se ve el resultado:


Puede escribir su propia función que acepte una cadena y la convierta en una Fecha usando el formato que desee, luego use los conjuntos como para establecerlo como un método. Entonces puede usar su función como parte de colClasses.

Tratar:

setAs("character","myDate", function(from) as.Date(from, format="%d/%m/%Y") ) tmp <- c("1, 15/08/2008", "2, 23/05/2010") con <- textConnection(tmp) tmp2 <- read.csv(con, colClasses=c(''numeric'',''myDate''), header=FALSE) str(tmp2)

Luego modifique si es necesario para trabajar con sus datos.

Editar ---

Es posible que desee ejecutar setClass(''myDate'') primero para evitar la advertencia (puede ignorar la advertencia, pero puede ser molesto si lo hace mucho y esta es una simple llamada que se deshace de él).


Si solo hay 1 formato de fecha que desea cambiar, puede usar el paquete Defaults para cambiar el formato predeterminado dentro as.Date.character

library(Defaults) setDefaults(''as.Date.character'', format = ''%d/%M/%Y'') dataImport <- read.csv("data.csv", colClasses = c("factor","factor","Date")) str(dataImport) ## ''data.frame'': 10 obs. of 3 variables: ## $ func_loc : Factor w/ 5 levels "3076WAG0003",..: 1 2 3 3 3 3 3 4 4 5 ## $ order_type : Factor w/ 3 levels "PM01","PM02",..: 3 3 1 1 1 1 2 2 3 1 ## $ actual_finish: Date, format: "2008-10-15" "2009-10-19" NA "2008-10-11" ...

Creo que la respuesta de @Greg Snow es mucho mejor, ya que no cambia el comportamiento predeterminado de una función de uso frecuente.