使用 lubridate 在一列中格式化多个日期格式

Format multiple date formats in one columns using lubridate

有时我得到的数据集具有两种不同的日期格式,但必须将公共变量合并到一个数据框中。多年来,我尝试了各种解决方案来解决这个工作流程的麻烦。现在我一直在使用 lubridate,这些问题中的许多似乎很容易解决。但是,我遇到了一些对我来说似乎很奇怪的行为,尽管我认为有一个很好的解释超出了我的范围。假设我得到了一个具有不同日期格式的数据集,我将它们加入到一个数据框中。该数据框如下所示:

library(ludridate)
library(dplyr)

df<-data.frame(Lab=c("A","B"),DATE=c("12/15/15","12/15/2013")); df

我想使用 lubridate 将此数据转换为日期格式。但是以下格式不一致:

df %>% 
  mutate(mdy(DATE))

...而是创建一个 0015 日期。如果我只为 Lab "A":

过滤
df %>% 
  filter(Lab=="A") %>%
  mutate(mdy(DATE))

...甚至 group_by 实验室:

df %>% 
  group_by(Lab) %>%
  mutate(mdy(DATE))

然后我得到了想要的年份格式。这是 lubridate 系列日期格式化函数的正确行为吗?有没有更好的方法来完成我正在做的事情?我确信一列中的多个日期格式是一种相对常见(且令人讨厌)的情况。

提前致谢。

来自 parse_date_time 上的帮助:

## ** how to use select_formats **
## By default %Y has precedence:
parse_date_time(c("27-09-13", "27-09-2013"), "dmy")
## [1] "13-09-27 UTC"   "2013-09-27 UTC"

## to give priority to %y format, define your own select_format function:

my_select <-   function(trained){
  n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y",     names(trained))*1.5
  names(trained[ which.max(n_fmts) ])
}

parse_date_time(c("27-09-13", "27-09-2013"), "dmy", select_formats = my_select)
## '[1] "2013-09-27 UTC" "2013-09-27 UTC"

parse_date_time of lubridate package 可以帮助一次性格式化多种日期格式。

语法:

df$date = parse_date_time(df$date, c(format1, format2, format3))

您需要指定所有可能的格式类型。

由于lubridate在理解(正确)一些格式类型上有一些困难,你需要自定义格式。

在帮助部分,您会找到下图。您可以重新创建它以满足您的要求。

## ** how to use `select_formats` argument **
## By default %Y has precedence:
parse_date_time(c("27-09-13", "27-09-2013"), "dmy")
## [1] "13-09-27 UTC"   "2013-09-27 UTC"

## to give priority to %y format, define your own select_format function:

my_select <-   function(trained){
   n_fmts <- nchar(gsub("[^%]", "", names(trained))) + grepl("%y", names(trained))*1.5
   names(trained[ which.max(n_fmts) ])
}

parse_date_time(c("27-09-13", "27-09-2013"), "dmy", select_formats = my_select)
## '[1] "2013-09-27 UTC" "2013-09-27 UTC"