【问题标题】:Format multiple date formats in one columns using lubridate使用 lubridate 在一列中格式化多种日期格式
【发布时间】:2016-03-27 03:23:37
【问题描述】:

有时给我的数据集有两种不同的日期格式,但公共变量必须连接到一个数据框中。多年来,我尝试了各种解决方案来解决这个工作流程的麻烦。现在我一直在使用 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 日期。如果我只过滤实验室“A”:

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

...甚至是 group_by 实验室:

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

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

提前致谢。

【问题讨论】:

  • This SO question 可能会有所帮助。
  • 我认为我的问题是独一无二的,因为相同的 lubridate 命令适用于两种情况 - 两位数年份和四位数年份。

标签: r lubridate


【解决方案1】:

lubridate 包中的parse_date_time 可以帮助一次性格式化多种日期格式。

语法:

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"

【讨论】:

  • 是的,刚刚意识到。可能我需要更频繁地刷新我正在处理的页面。
【解决方案2】:

来自 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2016-07-20
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多