【问题标题】:replace date in data.table in R returns unexpected value替换 R 中 data.table 中的日期返回意外值
【发布时间】:2014-03-11 07:20:34
【问题描述】:

我有一个按以下方式格式化的日期变量:

date  <- as.POSIXct(date, "%m-%d-%Y-%X")

例如,这可以是最近的日期:

“2014-03-04 23:59:59 EST”

现在我有一个 data.table DT,其中一列 time 表示其他日期,并且格式也为 .POSIXct(format: "%m-%d-%Y-%X")。现在我想用我的日期变量“date”替换 DT[,time] 中的一些缺失值(NA):

library(data.table)    
DT <- DT[is.na(time), time:= date]

但是,data.table 中替换的日期现在是“1970-01-01 14:30:24”(而不是“2014-03-04 23:59:59”)。

我错过了什么?

R:3.02
数据表:1.9.2

【问题讨论】:

    标签: r date data.table


    【解决方案1】:

    问题不在于 data.table,而本质上是因为您尝试将“日期时间”类型与同一向量中的另一种类型混合。这会重现错误:

      library(lubridate)  ## I am using lubridate for smart date conversion 
      origin <- mdy_hms("01-01-1970-00:00:01") ## Using origin as default value for dates
      date <- mdy_hms("3-11-2014-09:12:30")
      time = c(NA,1)
      ifelse(is.na(time),date,origin)
      [1] 1394529150          1       ## date is converted to numeric
    

    一种解决方案是先转换为字符串,然后再转换为日期时间

      ymd_hms(ifelse(is.na(time),paste(date),paste(origin))) ## paste used as as.character
    

    使用 data.table ,你可以得到相同的结果:

      dt = data.table(time=time,date = date)
      dt[,time:=ymd_hms(ifelse(is.na(time),paste(date),
                       paste(origin)))]
    
                     time                date
    1: 2014-03-11 09:12:30 2014-03-11 09:12:30
    2: 1970-01-01 00:00:01 2014-03-11 09:12:30
    

    PS:最好不要在这里强制时间变量,只要有缺失值就进行操作。

    【讨论】:

    • 感谢 agstudy - 这解决了问题(尽管在不同的类之间转换似乎有点费时)。我很惊讶 data.table 识别出一个日期(而不是你的例子,它变成了错误的类),但随后将它变成了错误的时间/日期。
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2021-08-21
    • 2014-05-14
    • 2011-12-27
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多