加速as.POSIXct与大数据/问题在data.table中存储为POSIXct

时间:2015-03-17 16:25:44

标签: r data.table posixct

我正在尝试从大型.csv(~11m行)中提取POSIXct登录时间列表,然后使用cut函数将每15分钟块的登录次数列表。

鉴于数据集的大小,我正在使用data.table函数。我已经设法实现了我的目标,但是我遇到了下面描述的一些问题:

#selective fread dt <- fread("foo.csv", colClasses=list(NULL=c(1:5,8:14), "POSIXct"=c(5,6)) )

问题:我尝试将2个相关列存储为POSIXct类,但它似乎存储为character类:

> class(dt$login_datetime) [1] "character"

我设法使用as.POSIXct运行我的其余代码,如下所示:

timeLog <- dt[,1, with=FALSE] timeLog<- timeLog[,login_datetime:=as.POSIXct(login_datetime)] tabulate <- data.frame(table(cut(timeLog, breaks="15 mins")))

但是,第二行大约需要12分钟才能在我的机器上运行。我需要以类似的方式处理更多的数据集,而12分钟的速度并不是非常慢,我很好奇我是否可以加快这个过程(缺少硬件升级)。

具体来说,我试图让fread直接将相关列存储为POSIXct类,但却无法。我无法在data.table vignette here中找到有关POSIXct的任何内容。

是否有人能够告诉我1)我对freadcolClasses="POSIXct"做错了什么,或2)如果还有其他方法/包来加速转换{{1列到POSIXct?

感谢。

1 个答案:

答案 0 :(得分:3)

我建议两种选择。

我假设您使用write.csv或类似内容,在撰写时将POSIXct转换为character。这会减慢写出和读入速度,因为POSIXct对象实际上是数字而不是字符(更确切地说,它们是秒以来#34; epoch&#34;)。因此,您可以将列转换为numeric,然后将其写出来,并在读入后转换回POSIXct(这将非常快)。

如果您希望写出字符列,则另一个选项是使用fastPOSIXct中的fasttime来加快转换为POSIXct