将POSIXlt日期分配给data.table列

时间:2016-11-14 22:55:00

标签: r data.table

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 1.9.6尝试将POSIXlt日期分配给列时抛出错误

例如:

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

是否有.rsd的内容使其无法处理此数据类型?

2 个答案:

答案 0 :(得分:3)

使用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> 

答案 1 :(得分:1)

以下是使用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的原因。