2017-01-27 6 views
2

Почему аргумент colClasses для data.table::fread, кажется, не преобразует столбец REQUEST_DATE в POSIXct в примере ниже? Он без проблем преобразует колонку ROW_ID.data.table colClasses преобразование в POSIXct

library(data.table) 

txt <- "ROW_ID,REQUEST_TYPE,REQUEST_DATE 
1,OTHER,2009-07-31 07:35:38 
2,OTHER,2009-07-30 21:18:35 
3,OTHER,2009-07-30 21:18:30 
4,OTHER,2009-07-30 21:18:40 
5,OTHER,2009-07-30 21:18:39 
6,QUERY,2009-07-30 21:19:29 
7,OTHER,2009-07-30 21:18:42 
8,OTHER,2009-07-30 21:18:45 
9,OTHER,2009-07-31 07:35:31 
10,OTHER,2009-07-31 07:35:30 
" 
dt <- fread(txt, colClasses = c(ROW_ID = "character", REQUEST_DATE = "POSIXct")) 

Типичная конверсия также работает:

dt[, as.POSIXct(REQUEST_DATE)] 
[1] "2009-07-31 07:35:38 EDT" "2009-07-30 21:18:35 EDT" "2009-07-30 21:18:30 EDT" "2009-07-30 21:18:40 EDT" "2009-07-30 21:18:39 EDT" 
[6] "2009-07-30 21:19:29 EDT" "2009-07-30 21:18:42 EDT" "2009-07-30 21:18:45 EDT" "2009-07-31 07:35:31 EDT" "2009-07-31 07:35:30 EDT" 

В данном конкретном случае я не могу сделать dt[, REQUEST_DATE := as.POSIXct(REQUEST_DATE)] Однако, поскольку реальные данные есть ~ 50m строк и количество столбцов. Альтернативный синтаксис также не похоже на работу:

dt <- fread(txt, colClasses = list(POSIXct = "REQUEST_DATE")) 

data.table помощь fread говорит «Символ вектор классов (с именем или без имени), а read.csv Или именованный список векторов имен столбцов. или номера, см. примеры. colClasses in fread предназначен для редких переопределений, а не для обычного использования. fread будет только продвигать столбец к более высокому типу, если colClasses запрашивает его. Он не будет понижать колонку до более низкого типа, поскольку NAs Вы должны принуждать такие столбцы впоследствии самостоятельно, если вам действительно нужна потеря данных ».

Непонятно, что POSIXct считается более низким, чем character.

Я пользуюсь data.table версии 1.10.0.

+1

Возможно, документы для colClasses arg необходимо обновить, но они говорят, что они находятся рядом с верхней частью. «Даты читаются как символ в настоящее время. После этого они могут быть преобразованы с использованием превосходного пакета быстрого времени или стандартных базовых функций». – Frank

+1

Действительно, я использую пакет быстрого времени. Он преобразует 50 м строк за 12 секунд, что очень хорошо! – ruser9575ba6f

ответ

1

Как замечает Фрэнк в комментариях, похоже, что это текущее ограничение data.table. Я закончил использовать функцию fastPOSIXct в пакете fasttime. Он конвертирует 50 м строк примерно через десять секунд на моем ноутбуке, что вполне разумно для моего варианта использования.