r - 将 DDMMYYYY 格式的字符串(无分隔符,三位数年份,省略千禧年)解析为 Date 类

标签 r date

我有一个格式为 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/

相关文章:

r - 来自 xtable 的 table* 环境

r - networkD3 中的forcenetwork 不生成任何图表,也没有错误

javascript - 如何仅显示来自 javascript date.toLocaleTimeString() 的小时和分钟?

javascript - Bootstrap Datepicker 仅年份不绑定(bind)

python - 如何使用python从csv中的同一列拆分日期和时间?

r - 设置 R bookdown 输入目录

r - Predict.glm(, type ="terms") 实际上做了什么?

html - 在 R 中将 HTML/CSS 转换为图像(png 或任何无损格式)

尽管格式有效,MySQL str_to_date 仍生成 NULL

MYSQL组合 View 在日期范围内具有不同数量的条目记录的两个表