【问题标题】:format the dates of several columns格式化几列的日期
【发布时间】:2020-06-02 14:26:15
【问题描述】:
dt <- data.table(date1 = c("14.01.2009", "9/2/2005",  "24/1/2010", "28.01.2014"),
                 var1 = rnorm(4,2,1), 
                 date2 = c("09.01.2009", "23/8/2005","17.01.2000", "04.01.2005"), 
                 d = c("2020-02-23", "2015-05-26", "2002-02-04"))

我试过这个脚本

for (j in seq_along(dt)) if (all(grepl('\\d+(\\.|/|-)\\d+(\\.|/|-)\\d+',dt[,j]))) set(dt,j = j, value = dmy(dt[[j]]))

我有以下错误:

[.data.table(dt, , j) 中的错误:j([...] 中的第二个参数)是单个符号,但未找到列名“j”。也许您打算使用 DT[, ..j]。与 data.frame 的这种差异是经过深思熟虑的,并在 FAQ 1.1 中进行了解释。

【问题讨论】:

    标签: r


    【解决方案1】:

    这里是data.table + lubridate 解决方案。

    library(data.table)
    library(lubridate)
    cols = names(dt)[ dt[, sapply( .SD, function(x) {
        all( grepl( "\\d+(\\.|/|-)\\d+(\\.|/|-)\\d+", x ) )
      } ) ] ]
    possible.date.formats <- c("d.m.Y", "d/m/Y", "Y-m-d") #possible data-formats
    dt[, (cols) := lapply( .SD, 
                           lubridate::parse_date_time, 
                           orders =  possible.date.formats ), 
       .SDcols = cols][]
    
    #         date1      var1      date2          d
    # 1: 2009-01-14 1.9459372 2009-01-09 2020-02-23
    # 2: 2005-02-09 3.7666378 2005-08-23 2015-05-26
    # 3: 2010-01-24 0.6207715 2000-01-17 2002-02-04
    # 4: 2014-01-28 2.8800135 2005-01-04 2020-02-23
    

    【讨论】:

    • 感谢您的回答,我不想选择日期列。我想避免舞台 cols = c("date1", "date2", "d") #columns with dates
    • ok.. 你如何告诉计算机日期在哪一列?
    • 是的!我发布的脚本适用于数据框,但不适用于数据表
    猜你喜欢
    • 2014-10-08
    • 2011-04-06
    • 2011-11-20
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多