将多个字符列更改为日期

时间:2018-01-29 12:15:42

标签: r tidyverse lubridate

我有多个字符列(大约20个),我想更改所有日期格式并使用r删除时间。我试过了loopsmutateapply

以下是仅使用两列的一些示例数据

col1 = c("2017-04-01 23:00:00", "2017-03-03 00:00:01", "2017-04-02 
00:00:01")
col2 = c("2017-04-10 08:41:49", "2017-04-10 08:39:48", "2017-04-10 
08:41:51")
df <- cbind(col1, col2)

我试过了:

df <- df %>% mutate(df, funs(ymd))

df <- df %>% mutate(df, funs(mdy))

两人都给了我一个错误。我也尝试将所有列名放在列表中并执行

for(i in namedlist) {
as_date(df[i])
glimpse(df)
}

这也不起作用。

我尝试使用Convert multiple columns to dates with lubridate and dplyr的答案,但这也没有用。那些帖子想要转换某些变量。我想要转换所有变量,因此var命令不适用。

有效建议吗?谢谢。

2 个答案:

答案 0 :(得分:1)

如果您申请的是所有列,则可以使用lapply拨打一个非常短的电话。我将使用data.table传递此处:

library( data.table )
setDT( df )

df <- df[ , lapply( .SD, as.Date ) ]

在测试数据上,这给出了:

> df
         col1       col2
1: 2017-04-01 2017-04-10
2: 2017-03-03 2017-04-10
3: 2017-04-02 2017-04-10

注意:您的测试数据实际上会生成matrix,因此您需要先将其转换为data.frame(或直接转换为data.table)。

您可以使用基础R执行相同的操作,但我个人更喜欢上述解决方案:

df <- as.data.frame( lapply( df, as.Date ) )

> df
        col1       col2
1 2017-04-01 2017-04-10
2 2017-03-03 2017-04-10
3 2017-04-02 2017-04-10

答案 1 :(得分:0)

编辑:这次使用as.Date函数的正确通配符。我还添加了一个可重现的示例:

library(dplyr)

df <- data.frame(date_1 = c("2019-01-01", "2019-01-02", "2019-01-03"),
                 date_2 = c("2019-01-04", "2019-01-05", "2019-01-06"),
                 value = c(1,2,3),
                 stringsAsFactors = F)

str(df)

date_cols <- c("date_1", "date_2")

df_2 <- df %>%
   mutate_at(vars(date_cols), funs(as.Date(., "%Y-%m-%d")))

str(df_2)