Укажите пользовательский формат даты для аргумента colClasses в read.table / read.csv

Вопрос:

Есть ли способ указать формат даты при использовании аргумента colClasses в read.table / read.csv?

(Я понимаю, что могу конвертировать после импорта, но с такими столбцами даты было бы легче сделать это на шаге импорта)

Пример:

У меня есть .csv со столбцами даты в формате.%d/%m/%Y

dataImport 
 joran23 окт. 2012 г., 03:32
Хакерский способ сделать это - создать собственную версиюread.table и добавитьformat аргумент, который передается наas.Date, Я бы нене удивлюсь, еслиэто лучший способ, которым яЯ не думаю о, хотя.

Ответы на вопрос(3)

Решение Вопроса

которая принимает строку и преобразует ее в дату, используя нужный формат, а затем используйтеsetAs установить его какas метод. Затем вы можете использовать свою функцию как часть colClasses.

Пытаться:

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)

Затем измените, если необходимо, для работы с вашими данными.

Редактировать ---

Вы могли бы хотеть бежатьsetClass('myDate') во-первых, чтобы избежать предупреждения (вы можете игнорировать предупреждение, но оно может стать раздражающим, если вы делаете это много, и это простой вызов, который избавляется от него).

 Josh O'Brien30 авг. 2013 г., 19:10
Что такоеsetMethod('myDate') должен делать? Запуск это просто дает мне ошибку ...
 jks61204 февр. 2019 г., 20:37
Для таких, как я, кто пришел этот поток в надежде реализовать его в,data.table::freadfread Безразлично»реализовать в ней типы датс преобразованиями, так что это не будет работать во время написания.fread
 Danny D'Amours10 янв. 2013 г., 21:35
Обратите внимание, что вы можете получитьнет определения для класса "мое свидание"' предупреждение, как подробно описано вэтот вопрос.
 Greg Snow30 авг. 2013 г., 19:47
@JoshO»Брайен, прости, что должен былsetClass (исправлено сейчас). Что это делает, это предотвратитьsetAs от выдачи предупреждения омое свидание' не существует как класс. Предупреждение безвредно, и все еще работает, но установка класса означает, что вы недаже не вижу предупреждения.
 Josh O'Brien30 авг. 2013 г., 19:53
Благодарю. Это все имеет смысл сейчас.
 MySchizoBuddy31 мар. 2014 г., 19:52
Лучше просто сохранить его как символ и затем выполнить преобразование столбца в дату, или сделать это, как указано выше?
 Greg Snow31 мар. 2014 г., 20:49
@ MySchizoBuddy, если у вас есть только один столбец даты, и вы делаете это один раз, то, вероятно, не имеет значения, каким образом вы это делаете. Но если в вашем наборе данных есть несколько столбцов, которые являются датами, то я думаю, что этот подход, вероятно, будет проще, чем изменение каждого из столбцов после прочтения.
 user29569105 дек. 2012 г., 16:08
Ух ты - setAs - спасатель! Как я никогда не видел эту функцию раньше?
 Tommy O'Dell23 окт. 2012 г., 04:10
Спасибо Грег - я не знаюне знаю оas или жеsetAs функции. Работает отлично.

вы можете использоватьDefaults пакет для изменения формата по умолчанию в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" ...

Я думаю, что @Greg Snow 'Ответ s гораздо лучше, так как он не меняет поведение по умолчанию часто используемой функции.

Если вам нужно время также:

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"

Ваш ответ на вопрос