将日期与data.table包一起使用

时间:2011-08-08 07:29:32

标签: r datetime data.table plyr

我最近发现了data.table包,现在想知道我是否应该替换我的一些plyr代码。总而言之,我真的很喜欢普利尔,我基本上实现了我想要的一切。但是,我的代码运行了一段时间,加快速度的前景足以让我进行一些测试。那些测试很快就结束了,这就是原因。

我经常使用plyr做的是将数据拆分为包含日期的列并进行一些计算:

library(plyr)
DF <-  data.frame(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
#Split up data and apply arbitrary function
ddply(DF, .(Date), function(df){mean(df$y) - df[nrow(df), "y"]})

但是,使用具有日期格式的列似乎不适用于data.table:

library(data.table)
DT <- data.table(Date=rep(c(Sys.time(), Sys.time() + 60), each=6), y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)
#Error in setkey(DT, Date) : Column 'Date' cannot be auto converted to integer without losing information.

如果我正确理解了包,那么当我使用setkey()时,我只能获得大幅提升。另外,我认为在Date和数字之间不断转换不是很好的编码。所以我错过了一些东西,或者只是没有简单的方法来实现data.table?

sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] C

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.6.3 zoo_1.7-2        lubridate_0.2.5  ggplot2_0.8.9    proto_0.3-9.2    reshape_0.8.4   
[7] reshape2_1.1     xtable_1.5-6     plyr_1.5.2      

loaded via a namespace (and not attached):
[1] digest_0.5.0    lattice_0.19-30 stringr_0.5     tools_2.13.1 

1 个答案:

答案 0 :(得分:7)

这应该有效:

DT <- data.table(Date=as.ITime(rep(c(Sys.time(), Sys.time() + 60), each=6)),
                 y=c(rnorm(6, 1), rnorm(6, -1)))
setkey(DT, Date)

data.table包中包含一些带整数存储模式的日期/时间类。 见?IDateTime

  

带有整数存储的日期和时间类,用于快速排序和   分组。仍然是实验性的!

  • IDate是从Date派生的日期类。它与Date类具有相同的内部表示形式,但存储模式为整数。
  • ITime是一个时间类,存储为当天的整数秒数。 as.ITime不允许超过24小时的日期。由于ITime存储在几秒钟内,您可以将其添加到POSIXct对象,但不应将其添加到Date对象。
  • IDateTime获取日期时间输入并返回包含datetime列的数据表。