parse_date_time混合日期和月份

时间:2017-08-29 19:26:05

标签: r date lubridate

我在数据中的几列中使用parse_date_time,这些列具有多种日期格式。例如,列可以包含日期格式"%d-%b-%y""%m/%d/%Y"

因此,"06/11/2017""%m/%d/%Y")和"11-Jun-17""%d-%b-%y")对应的日期相同:“2017-06-11”("%Y-%m-%d"

我正在使用lubridate::parse_date_time来解析日期,其中可以在orders参数中指定不同的日期格式:

x <- c("06-11-2017", "11-Jun-17")
parse_date_time(x, orders = c("%d-%b-%y", "%m/%d/%Y"), locale = "eng")
# [1] "2017-11-06 UTC" "2017-06-11 UTC"

虽然这应该将这两个日期吐出为"2017-06-11",但它不会在"%m/%d/%Y"日期正确解析月份和日期,通过更改月份进行检查:

x <- c("05-11-2017", "11-Jun-17")
parse_date_time(x, orders = c("%d-%b-%y", "%m/%d/%Y"), locale = "eng")
# [1] "2017-11-05 UTC" "2017-06-11 UTC"

05应解析为%m,但不是。{/ p>

我对parse_date_time的调查表明存在错误,我认为这是错误的。但是,我想知道我能做些什么才能得到我需要的结果?

更新:这是我正在使用的数据的一个示例。通过添加“exact = TRUE”,它解决了我的问题。

  

测试$ Transmission.date    [1]“22-Feb-16”“10-Mar-16”“10-Mar-16”“10-Mar-16”“15-Jan-16”“15-Jan-16”“15-Jan- 16“”15-Jan-16“”15-Jan-16“”15-Jan-16“”2016/4/6“   [12]“2016/4/6”“2016/4/6”“2016/4/6”“2016/12/14”“2016/12/14”“2016/12/4”“4/12 / 2016“”2016/12/14“”2016/12/14“”2016/12/14“”2016/12/14“   [23]“2016年4月4日”“2016/4/4”“2016/4/4”“2016/4/4”“2016/4/4”“2016/4/4”“4/4 / 2016“2016/4/4”“2016/4/4”“2016/4/4”“2016/4/4”   [34]“2016/4/4”“2016/4/4”   测试$ Buyer.RFQ.Close.Date    [1]“25-Feb-16”“10-Mar-16”“10-Mar-16”“10-Mar-16”“27-Jan-16”“27-Jan-16”“27-Jan- 16“”27-Jan-16“”27-Jan-16“”27-Jan-16“”2016/5/4“   [12]“2016/5/4”“2016/5/4”“2016/5/4”“2016/10/5”“2016/10/5”“2016/10/5”“5/10 / 2016“”2016/10/5“”2016/10/5“”2016/10/5“”2016/10/5“   [23]“2016/10/5”“2016/4/28”“2016/2/5”“2016/4/28”“2016/2/2”“2016/2/2”“5/2 / 2016“”2016/2/15“”2016/2/5“”2016/4/28“”2016/2/15“   [34]“2016/4/28”“2016/2/2”   测试$ RFQ.close.date    [1]“25-Feb-16”“10-Mar-16”“10-Mar-16”“10-Mar-16”“27-Jan-16”“27-Jan-16”“27-Jan- 16“”27-Jan-16“”27-Jan-16“”27-Jan-16“”2016/4/22“   [12]“2016/4/22”“2016/4/22”“2016/4/22”“2016/5/3”“2016/5/3”“2016/5/3”“5/3 / 2016“”2016/5/3“”2016/5/3“”2016/5/3“”2016/5/3“   [23]“2016/5/3”“”“2016/4/28”“”“2016/4/28”“2016/4/28”“2016/4/28”“2016/4/28”“ 2016/4/28“”“2016/4/28”   [34]“”“2016/4/28”

1 个答案:

答案 0 :(得分:2)

如果它只有两种不同的格式,你可以相对轻松地在基础R中进行。如果可以有更多格式,则需要其他方法

x = c("06/11/2017", "11-Jun-17")
as.Date(x, format = c("%m/%d/%Y", "%d-%b-%y")[1 + grepl(pattern = "\\D{3}", x)])
#[1] "2017-06-11" "2017-06-11"
相关问题