lubridate日期解析,以0开头的日期

时间:2018-08-02 18:09:32

标签: r lubridate

我正在使用以下代码解析日期,但按照以下格式似乎无效: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

1 个答案:

答案 0 :(得分:3)

这不是错误,更可能是“功能”的副作用。

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

此外,lubridate::parse_date_time通过支持heterogenuous date-times(从其手册页开始)试图变得聪明,因此"09-01-01""090101"将被解析为同一事物。 / p>

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

因此,缓解此问题的方法:

  • 减少可能的orders=格式的数量;您提供的越多,就越有可能出错
  • 删除所有以"m"开头的格式字符串,只有在您确定日期不会以月开头的情况下才可行
  • 如果您对要获取的字符串类型有一定的控制权,请限制使用数字对数月份,以使解析器更好地拍摄
  • 不要使用parse_date_time,也许不要使用其他功能(例如,dmy或不使用lubridate
  • file a bug,如果您对此有足够的信心,尽管尝试使用“ gazillion”格式的字符串时会保持开放的态度