R 解析日期时间混淆日期和月份

R 解析日期时间混淆日期和月份,r,date,lubridate,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
,这些列有多种日期格式。例如,列的日期格式可以是
“%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"
05
应解析为
%m
,但它不是

我对
parse\u date\u time
的调查表明存在漏洞,我认为这里就是这种情况。然而,我想知道我能做些什么来获得我需要的结果

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

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


如果只有两种不同的格式,那么可以相对轻松地在BaseR中实现。如果可以有更多的格式,则需要其他方法

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"

@alexb523看起来像一只虫子。我无法让它同时解析这两个(它是非此即彼)。我甚至尝试了
parse\u date\u time(x,c(“%m/%d/%Y”,“%d-%m-%Y”),exact=TRUE)
,这似乎是万无一失的;您可以查看
select\u formats
,但我以前从未使用过它。您应该添加
库(无论函数来自何处)
。我认为这是一个类似于我几年前报告的错误:
命令的某些组合
不能很好地发挥作用。不起作用:
parse_date_time(“2017年11月6日”),orders=c(“dby”,“mdY”),locale=“eng”)
。作品:
parse_date_time(“06-11-2017”,orders=“mdY”,locale=“eng”)
parse_date\u time(c(“06-11-2017”、“07-06-11”)、orders=c(“mdY”、“ymd”)、locale=“eng”)
@CPak我认为你的
exact=TRUE
成功了!好!!没有为我工作(返回
NA
)…您正在使用哪个版本的
lubridate
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"