使用 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"
有时我得到的数据集具有两种不同的日期格式,但必须将公共变量合并到一个数据框中。多年来,我尝试了各种解决方案来解决这个工作流程的麻烦。现在我一直在使用 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"