【问题标题】:assign POSIXlt date to data.table column [duplicate]将 POSIXlt 日期分配给 data.table 列[重复]
【发布时间】:2016-11-14 22:54:59
【问题描述】:

data.table 1.9.6 尝试将 POSIXlt 日期分配给列时会引发错误

例如:

dt <- data.table(strdate = c("20140101", "20140103"))
dt[, date := strptime(strdate, "%Y%m%d")]
Warning message:
  In `[.data.table`(dt, , `:=`(date, strptime(strdate, "%Y%m%d"))) :
  Supplied 11 items to be assigned to 2 items of column 'date' (9 unused)

dt
    strdate date
1: 20140101  0,0
2: 20140103  0,0

但是,数据框可以工作

df <- as.data.frame(dt)
df$date <- strptime(df$strdate, "%Y%m%d")
df
   strdate       date
1 20140101 2014-01-01
2 20140103 2014-01-03

data.table 是否有什么东西使它无法处理这种数据类型?

【问题讨论】:

  • 看看unclass(strptime(dt$strdate, "%Y%m%d"))——POSIXlt其实是一个列表对象。另见 - stackoverflow.com/questions/21487614/…
  • 已记录在案。只需改用POSIXctdata.table 有很好的转换器,如 as.IDate()as.ITime()。请参阅我刚刚添加的答案。

标签: r data.table


【解决方案1】:

只需使用POSIXct,除其他外,您可以从随时包中免费获得。

R> dt <- data.table(strdate = c("20140101", "20140103"))
R> dt
    strdate
1: 20140101
2: 20140103
R> library(anytime)
R> dt[, date := anytime(strdate)]   # creates POSIXct, use anydate() for Date
R> dt
    strdate       date
1: 20140101 2014-01-01
2: 20140103 2014-01-03
R> 

该列现在包含您仍然可以计算的正确日期(时间)表示:

R> dt[, newdate := as.IDate(date) + 7]
R> dt
    strdate       date    newdate
1: 20140101 2014-01-01 2014-01-08
2: 20140103 2014-01-03 2014-01-10
R> 

或者,如果您想要日期,只需使用Date 类型,例如通过anydate()

R> dt <- data.table(strdate = c("20140101", "20140103"))
R> dt[, date := anydate(strdate)]
R> dt[, newdate := date + 7]
R> dt
    strdate       date    newdate
1: 20140101 2014-01-01 2014-01-08
2: 20140103 2014-01-03 2014-01-10
R> 

【讨论】:

    【解决方案2】:

    这是使用lubridate 的解决方法:

    dt$date <- as.POSIXct(lubridate::ymd(strptime(dt$strdate, "%Y%m%d")))
    
        strdate       date
    1: 20140101 2014-01-01
    2: 20140103 2014-01-03
    

    另请参阅this post,了解为什么我们使用 POSIXct 而不是 POSIXlt 和 data.table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 2013-10-27
      • 2015-03-28
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多