我正在尝试从大型.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)我对fread
和colClasses="POSIXct"
做错了什么,或2)如果还有其他方法/包来加速转换{{1列到POSIXct?
感谢。
答案 0 :(得分:3)
我建议两种选择。
我假设您使用write.csv
或类似内容,在撰写时将POSIXct
转换为character
。这会减慢写出和读入速度,因为POSIXct
对象实际上是数字而不是字符(更确切地说,它们是秒以来#34; epoch&#34;)。因此,您可以将列转换为numeric
,然后将其写出来,并在读入后转换回POSIXct
(这将非常快)。
如果您希望写出字符列,则另一个选项是使用fastPOSIXct
中的fasttime
来加快转换为POSIXct
。