我正在使用以下代码解析日期,但按照以下格式似乎无效: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
答案 0 :(得分:3)
这不是错误,更可能是“功能”的副作用。
这归结为lubridate
支持的“宽松”扩展名。例如,严格意义上的m
是月份数字,但是lubridate
也会扩展为包括缩写名称和完整月份名称。同样,y
通常只是两位数的年份,但也扩展到包括世纪。 (类似于多态代码,这种灵活性要付出代价:可能会出错。)
此外,lubridate::parse_date_time
通过支持heterogenuous date-times
(从其手册页开始)试图变得聪明,因此"09-01-01"
和"090101"
将被解析为同一事物。 / p>
在这种情况下,由于您使用m
和y
,因此它尝试仅使用数字,并将14
与y
匹配,忽略所有非数字(因为您建议数字),并且将20
视为一天。如果删除所有以月份开头的格式字符串,它将不再尝试查找该顺序。
因此,缓解此问题的方法:
orders=
格式的数量;您提供的越多,就越有可能出错"m"
开头的格式字符串,只有在您确定日期不会以月开头的情况下才可行parse_date_time
,也许不要使用其他功能(例如,dmy
或不使用lubridate
)