创建带有日期时间POSIXlt的R数据表时出现错误

23

创建带日期时间列的数据表时出现问题:

> 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 = ""))

创建数据框并转换为数据表成功!

> 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"

我是否漏掉了什么或者这是一个bug?如果是bug的话,应该在哪里报告?

请注意,我使用的是R版本3.0.0,我看到一些关于使用版本3.0.2构建的软件包的警告。这可能是问题的原因吗?我应该升级R本身吗?不过我做的其他事情似乎都正常。


可能是重复的问题:将字符串转换为IDateTime - Blue Magister
8
[tag:data.table] 不支持POSIXlt类型,因为其大小和结构。请改用POSIXctITime。升级到最新版本的R - 通常会使你的生活更轻松。 - Blue Magister
1个回答

21

对 Blue Magister 的评论的响应进行格式化(非常感谢),data.table 不支持 POSIXlt 数据类型,出于性能原因--请参见 将字符串转换为 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

如果有人能从中受益,我想在此额外提醒一下。我想要从我的输入数据中创建日期和时间,并将其分别存储到不同的字段中。

我发现学习(请参见?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" 

4
POSIXct是一个日期时间格式,而不仅仅是日期:as.POSIXct("2014-01-31 06:02:36") - Blue Magister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接