data.table colClasses转换为POSIXct

时间:2017-01-27 21:25:46

标签: r data.table

为什么colClasses的{​​{1}}参数似乎不会在下面的示例中将data.table::fread列转换为REQUEST_DATE?它可以毫无问题地转换POSIXct列。

ROW_ID

典型的转换也有效:

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" ,因为真实数据有~50m行和多列。替代语法似乎也不起作用:

dt[, REQUEST_DATE := as.POSIXct(REQUEST_DATE)]

dt <- fread(txt, colClasses = list(POSIXct = "REQUEST_DATE")) 的{​​{1}}帮助说&#34;类(命名或未命名)的字符向量,如read.csv。或列名称或数字的矢量命名列表,请参阅示例。 fread中的colClasses用于罕见的覆盖,而不是常规使用。如果colClasses请求它,fread只会将列提升为更高的类型。由于会产生NAs,它不会将列降级为较低的类型。如果你真的需要数据丢失,你必须自己强制执行这些专栏。&#34;

我不清楚data.table被认为是低于fread的类型。

我正在使用POSIXct版本1.10.0。

1 个答案:

答案 0 :(得分:3)

正如弗兰克在评论中提到的那样,这似乎是当前的 if(!empty($data['tags'])) { $query->andWhere(':tag MEMBER OF n.tags')->setParameter('tag', $data['tags']); } 限制。我最终使用data.table包中的fastPOSIXct函数。它在我的笔记本电脑上在大约十几秒内转换了50米的行,这对我的用例非常合理。