改变和格式化多个日期列

Mutate and format multiple date columns

我有一个 tibble 包含一些格式化为字符串的日期列:

library(tidyverse)

df<-tibble(dates1 = c("2020-08-03T00:00:00.000Z", "2020-08-03T00:00:00.000Z"),
           dates2 = c("2020-08-05T00:00:00.000Z", "2020-08-05T00:00:00.000Z"))

我想将字符串从 YMD-HMS 转换为 DMY-HMS。有人可以向我解释为什么这不起作用吗:

df %>% 
  mutate_at(vars(starts_with("dates")), as.Date, format="%d/%m/%Y %H:%M:%S")

而这个呢?

df %>% mutate(dates1 = format(as.Date(dates1),  "%d/%m/%Y %H:%M:%S")) %>% 
  mutate(dates2 = format(as.Date(dates2),  "%d/%m/%Y %H:%M:%S"))

最后,是否可以将这些列分配为 'datetime' 列(例如 dttm)而不是 chr 一旦日期格式发生了?

您传递的 format 参数用于 as.Date 而您真正想要的是将其传递给 format 函数。您可以为此使用匿名函数或使用公式语法。

library(dplyr)
df %>% 
  mutate(across(starts_with("dates"), ~format(as.Date(.), "%d/%m/%Y %H:%M:%S")))

# A tibble: 2 x 2
#  dates1              dates2             
#  <chr>               <chr>              
#1 03/08/2020 00:00:00 05/08/2020 00:00:00
#2 03/08/2020 00:00:00 05/08/2020 00:00:00

要将数据表示为日期或日期时间,R 使用标准方式表示它们,即 Y-M-D H:M:S,您可以使用 format 更改表示,但输出将是上述字符。

df %>% 
  mutate(across(starts_with("dates"), lubridate::ymd_hms))

#  dates1              dates2             
#  <dttm>              <dttm>             
#1 2020-08-03 00:00:00 2020-08-05 00:00:00
#2 2020-08-03 00:00:00 2020-08-05 00:00:00