对以 0 开头的日期进行 lubridate 日期解析

lubridate date parsing for dates starting with 0

我正在使用以下代码解析日期,但它似乎无法按照 2017 年 8 月 4 日、2017 年 8 月 5 日的格式运行。基本上,如果日期从 0 开始,我们会一起使用多种订单格式,如下所示。 对于下面的示例,它会将输出抛出为 2014-04-20 UTC

library(lubridate)
dateStr <- "04-Apr-2014"
newdate <- parse_date_time(dateStr,orders =c("m d y","m-d-y","m/d/y","d m y","d-m-y","d/m/Y","d B y","d-B-y","d/B/y","B d y","B-d-y","B/d/y","y m d","y d m","y-m-d","y-d-m","y/m/d"),locale = "eng")
newdate

这不是错误,更可能是 "feature".

的副作用

这归结为 lubridate 支持的 "relaxed" 扩展。例如,严格意义上的 m 是月份 number,但 lubridate 也扩展为包括缩写和完整的月份名称。同样,y 通常只是两位数的年份,但也扩展为包括世纪。 (类似于多态代码,这种灵活性是有代价的:出错的可能性。)

此外,lubridate::parse_date_time 试图通过支持 heterogenuous date-times(来自其手册页)变得聪明,因此 "09-01-01""090101" 将解析为相同的东西.

在这种情况下,由于您使用 my,它会尝试仅使用数字,并将 14 匹配到 y,忽略所有非-数字(因为您 建议 数字),并将 20 视为日期。如果您删除所有以月份为前导的格式字符串,它将不再尝试查找该顺序。

因此,针对此问题的缓解措施:

  • 减少可能的 orders= 格式;你提供的越多,就越容易出错
  • 删除所有以 "m" 开头的格式字符串,只有在您确定日期不以月份
  • 开头时才可行
  • 如果您对获取的字符串类型有一些控制,那么限制使用数字与命名月份,也许会给解析器一个更好的机会
  • 不要使用 parse_date_time,也许使用其他函数(例如,dmy 或不使用-lubridate
  • file a bug 如果您对此有足够强烈的感受,尽管您在尝试 "a gazillion" 格式化字符串时让自己敞开心扉