Specificare il formato data personalizzato per l’argomento colClasses in read.table / read.csv

Domanda:

C’è un modo per specificare il formato della data quando si utilizza l’argomento colClasses in read.table / read.csv?

(Capisco che posso convertire dopo l’importazione, ma con molte colonne di date come questa, sarebbe più facile farlo nella fase di importazione)


Esempio:

Ho un .csv con colonne della data nel formato %d/%m/%Y

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

Ciò rende la conversione sbagliata. Ad esempio, il 15/07/2008 diventa 0015-07-20 .


Codice riproducibile:

 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 

Ed ecco come appare l’output:

uscita del codice

È ansible scrivere la propria funzione che accetta una stringa e convertirla in una data utilizzando il formato desiderato, quindi utilizzare la setAs per impostarla as metodo. Quindi puoi usare la tua funzione come parte delle colClass.

Provare:

 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) 

Quindi modificare se necessario per lavorare per i dati.

Modificare ---

Potresti voler eseguire setClass('myDate') per evitare l'avviso (puoi ignorare l'avviso, ma può diventare fastidioso se lo fai molto e questa è una semplice chiamata che ti libera).

Se è necessario modificare solo il formato di 1 data, è ansible utilizzare il pacchetto Defaults per modificare il formato predefinito all’interno di 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" ... 

Penso che la risposta di @Greg Snow sia di gran lunga migliore, in quanto non cambia il comportamento predefinito di una funzione usata spesso.

Nel caso abbiate bisogno di tempo anche:

 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"