【问题标题】:Mutate and format multiple date columns [duplicate]变异和格式化多个日期列[重复]
【发布时间】:2020-08-25 15:12:09
【问题描述】:

我有一个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"))

最后,是否可以将这些列分配为“日期时间”列(例如 dttm),而不是在日期格式化后将 chr 分配给?

【问题讨论】:

    标签: r datetime date-manipulation


    【解决方案1】:

    您传递的 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
    

    【讨论】:

    • 感谢 Ronak 对format 的解释。对于我的特定应用程序,我必须将数据输出为 DMY-HMS(其他软件需要这种格式的日期)。我猜我不能在 R 中将数据表示为 DMY-HMS?如果我想将其显示为 DMY-HMS,听起来列类型 必须chr
    • 是的,这是真的。如果您想要DMY-HMS 格式的数据,它将是字符。
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多