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)
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
.
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:
È 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"