【问题标题】:lubridate date parsing for dates starting with 0润滑以 0 开头的日期的日期解析
【发布时间】:2018-08-02 18:09:32
【问题描述】:

我正在使用以下代码来解析日期,但它似乎不适用于 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

【问题讨论】:

  • 似乎是 lubridate 问题页面更好的报告地方:github.com/tidyverse/lubridate/issues
  • 另外,你为什么要尝试这么多格式?如果您只使用parse_date_time(dateStr,orders =c("d-m-y"),locale = "eng"),它似乎可以工作。
  • dmy(dateStr) 看起来也不错。
  • 是的,如果我只输入parse_date_time(dateStr,orders =c("d-m-y"),locale = "eng"),它就会起作用。但是,即使所有格式,上述代码也适用于 2014 年 4 月 4 日。所以我的查询是为什么它应该是不同的,如果它是 4 或 04 当字符串的其余部分非常明显 Apr-2014.. 我需要放置所有格式以便在大文档中捕获不同的日期格式(10000 页文档)

标签: r lubridate


【解决方案1】:

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

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

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

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

所以,缓解这个问题:

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

【讨论】:

  • 是的,m 和 y 都导致了这个问题,用 Y 替换 y 似乎可以解决这个问题,我需要不同的格式,因为我正在解析一个大文档,它可能包含不同的日期格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2020-11-10
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多