我有一个格式为 DDMMYYY (省略千禧年字符) 的日期字符向量,我必须将其转换为日期向量。
dates <- c("0410988", "2305009", "1111964", "0204015", "1803015", "0709015","0401015", "2012015", "3004158", "1205015")
这些是预期的输出日期:
2009-05-23、1964-11-11、2015-04-02、2015-03-18、015-09-07、2015-01-04、2015-12-20、2158-04-30 , 2015-05-12
我尝试删除第一个 Y 字符并使用常规 as.Date()
和 format= %d%m%y
:
dates <- c("0410988", "2305009", "1111964", "0204015", "1803015", "0709015","0401015", "2012015", "3004158", "1205015")%\>%
sapply(dates, function(x) paste0(substr(x, 1, 4), substr(x, 6, nchar(x)))) %\>%
as.Date(., format = "%d%m%y")
但这显然不起作用:1111964 被转换为 2064-11-11 而不是 1964-11-11,3004158 被转换为 2058-04-30 而不是 2158-04-30(这个日期不明确)就这样)。
我还尝试使用 substring()
分别提取代表日、月和年的字符,然后将它们插入到 make_date()
中。然而,这对于每年只有 3 个数字的情况不起作用(这里只是 1111964 的工作示例):
make_date("964", "11", "11")
[1] "964-11-11"
我不能只在年份上加 1000,因为它在 2000 年之后的几年里都不起作用,所以我认为必须有更好的方法来进行这种转换。
最佳答案
评论中 2 年答案的基本 R 替代方案是使用 ifelse
来确定第 5 个位置是否有“9”或“0”,然后使用 gsub
输入千年并转换为四年日期:
as.Date(ifelse(substr(dates, 5,5) == "9",
gsub('^([0-9]{4})', '\\11', dates),
gsub('^([0-9]{4})', '\\12', dates)),
format = "%d%m%Y")
输出:
# [1] "1988-10-04" "2009-05-23" "1964-11-11" "2015-04-02" "2015-03-18"
# [6] "2015-09-07" "2015-01-04" "2015-12-20" "2158-04-30" "2015-05-12"
关于r - 将 DDMMYYYY 格式的字符串(无分隔符,三位数年份,省略千禧年)解析为 Date 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76181623/