使用日期时间POSIXlt创建R data.table时出错

时间:2014-01-31 18:38:58

标签: r data.table

使用日期时间列创建data.table时出现问题:

> mdt <- data.table(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S"))
> class(mdt)
[1] "data.table" "data.frame"
> print(mdt)
Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE),  : 
  length of 'dimnames' [1] not equal to array extent

Enter a frame number, or 0 to exit   

1: print(list(id = 1:3, d = list(sec = c(36, 48, 12), min = c(2, 2, 3), hour = c(6, 6, 7), mday = c(31,
2: print.data.table(list(id = 1:3, d = list(sec = c(36, 48, 12), min = c(2, 2, 3), hour = c(6, 6, 7), m
3: `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), ":", sep = ""))

创建为data.frame并转换为data.table有效!

> mdf <- data.frame(id=1:3, d=strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S"))
> print(mdf)
  id                   d
1  1 2014-01-31 06:02:36
2  2 2014-01-31 06:02:48
3  3 2014-01-31 07:03:12
> mdt <- as.data.table(mdf)
> print(mdt)
   id                   d
1:  1 2014-01-31 06:02:36
2:  2 2014-01-31 06:02:48
3:  3 2014-01-31 07:03:12
> class(mdt)
[1] "data.table" "data.frame"

我错过了什么或是错误吗?如果有错误,我该在哪里举报?

注意我使用的是R版3.0.0,我看到了一些警告。使用3.0.2版构建的软件包。这可能是问题吗?我应该升级R本身吗?我做的其他一切似乎都在起作用。

1 个答案:

答案 0 :(得分:17)

格式化Blue Magister评论的回复(非常感谢),data.table因性能原因不支持POSIXlt数据类型 - 请参阅cast string to IDateTime建议尽可能重复。

所以要走的路是将时间作为ITime(由data.table提供的类型)或日期时间(或仅限日期)作为POSIXct,取决于日期信息是否重要:

> mdt <- data.table(id=1:3, d=as.ITime(strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")))
> print(mdt)
   id        d
1:  1 06:02:36
2:  2 06:02:48
3:  3 07:03:12
> mdt <- data.table(id=1:3, d=as.POSIXct(strptime(c("06:02:36", "06:02:48", "07:03:12"), "%H:%M:%S")))
> print(mdt)
   id                   d
1:  1 2014-01-31 06:02:36
2:  2 2014-01-31 06:02:48
3:  3 2014-01-31 07:03:12

作为额外的注意事项,如果有人可以从中受益,我想创建日期&amp;我输入数据的时间与日期和时间时间在不同的领域。 我发现学习(参见?ITime)是有用的,可以将时间ITime添加到日期时间POSIXct并获得日期时间POSIXct,如下所示:

> mdt <- as.POSIXct("2014-01-31") + as.ITime("06:02:36")
> print(mdt)
[1] "2014-01-31 06:02:36 EST"
> class(mdt)
[1] "POSIXct" "POSIXt"