2017-08-29 49 views
1

我在我的数据中有几列使用parse_date_time,这些列有多种日期格式。例如,一列可能有日期格式"%d-%b-%y""%m/%d/%Y"parse_date_time混合日期和月份

因此,"06/11/2017""%m/%d/%Y")和"11-Jun-17""%d-%b-%y")对应于同一日期“2017年6月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,但事实并非如此。

我对parse_date_time的调查显示有错误,我认为这是错误。但是,我想知道我能做些什么来获得我需要的结果?

更新:这里是我正在使用的数据的一个例子。通过添加“精确=真”它修复了我的问题。

测试$ 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”“4/6/2016” [12]“4/6 “2016/04/26”“2016/04/26”“2016/04/14”“2016/12/14”“2016/12/30”“2016/12/30”“2016/04/14”“4/12/2016/04/12“”2016/04/12“”2016/12/14“ [23]”2016/12/14“”2016/04/24“”2016/04/24“”4 “2016/04/24”“2016/04/14”“2016/04/24”“2016/04/24”“2016/04/24”“2016/04/24”“2016/04/24”“4/2016年4月“ ”[4]“2016年4月4日”“2016年4月4日” test $ Buyer.RFQ.Close.Date [1]“25-Feb-16”“10-三月-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“”5/4/2016“ [12]“2016/05/24”“2016/05/25”“2016/05/25”“2016/10/25”“2016/10/10”“2016/10/10”“5/10/2016”“5/10 “2016/10/20”“2016/10/10”“2016/10/10”“2016/10/10”“2016/10/10” [23]“2016/10/10”“2016/04/28”“ 2016/05/25“”2016/05/25“”2016/05/25“”2016/05/25“”2016/05/25“”2016/5/2“”2016/5/2“”4/28/2016“”5/2/2016“ [34]”2016/4/28“”2016/5/2“ test $ 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“”2016-1-1“2016-4-22” [12]“2016/4/22”“2016/04/22”“2016/4/22”“2016/5/3” “”2016/05/23“”2016/05/23“”2016/05/23“”2016/05/23“ [5] 2016/4/28“”“”“2016/04/28”“”“2016/04/28”“2016/04/28”“2016/04/28” “2016/4/28”“”“2016/4/28” [34]“”“2016/4/28”

+1

@ alexb523似乎是一个错误。我无法解析它(它是或者)。我甚至尝试过''parse_date_time(x,c(“%m /%d /%Y”,“%d-%m-%Y”),exact = TRUE)你可以看看'select_formats',但我从来没有用过它 – CPak

+1

你应该添加'library(wherever_that_function_comes_from)'。 – Frank

+1

我认为这是一个类似于我几年前报告的错误:[使用parse_date_time解析日期格式为dmy和dmY](https://stackoverflow.com/questions/19127095/parse-dates-in-format- dmy-together-with-dmy-using-parse-date-time-in-package-lub),其中'orders'的某些组合运行不好。无效:'parse_date_time(“06-11-2017”,orders = c(“dby”,“mdY”),locale =“eng”)''。 Works:'parse_date_time(“06-11-2017”,orders =“mdY”,locale =“eng”)'; 'parse_date_time(c(“06-11-2017”,“07-06-11”),orders = c(“mdY”,“ymd”),locale =“eng”)' – Henrik

回答

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"