【发布时间】:2012-09-01 16:00:42
【问题描述】:
如果日期向量有两位数的年份,mdy() 将 00 到 68 之间的年份转换为 21 世纪年份,并将 69 和 99 之间的年份转换为 20 世纪年份。例如:
library(lubridate)
mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))
给出以下输出:
Multiple format matches with 5 successes: %m/%d/%y, %m/%d/%Y.
Using date format %m/%d/%y.
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC" "2004-01-02 UTC"
我可以通过从不正确的日期中减去 100 将 2054 和 2068 变成 1954 和 1968 来解决这个问题。但是有没有更优雅、更不容易出错的方法来解析两位数的日期以便处理它们在解析过程本身中正确吗?
更新:在@JoshuaUlrich 将我指向strptime 之后,我找到了this question,它处理的问题与我的类似,但使用的是base R。
在 R 中对日期处理的一个很好的补充似乎是在日期解析函数中处理两位数日期的世纪选择截止值。
【问题讨论】:
-
从技术上讲,日期被正确解析,因为文档 (
?strptime) 指出:“在输入时,值 00 到 68 以 20 为前缀,而 69 到 99 以 19 为前缀 - 也就是说2004 和 2008 POSIX 标准规定的行为”。?parse_date简要告诉您查看?strptime的格式。 -
我应该更准确。我并不是要暗示
lubridate有一个错误,而仅仅是因为两位数年份的模糊性,包的自然行为导致不正确的四位数年份(“不正确”在“不是期望的结果”)在一些相对常见的情况下。我希望lubridate中有某种方法可以指定“开关”或“截止”值,从而为给定的两位数日期范围提供所需的世纪。 -
建议您向 lubridate 的 github 页面提交功能请求。
-
请注意,这不再是 lubridate 的行为。对于您的示例,输出现在是
[1] "2054-01-02 UTC" "2068-01-02 UTC" "2069-01-02 UTC" "2099-01-02 UTC" "2004-01-02 UTC"。 -
@skan,
parse_date_time2有一个 cutoff_2000 选项。您可以在此处指定不同的截止年份。