R语言 将DDMMYYY格式的字符串(无分隔符,三位数年份,省略千禧年)解析为Date类

xam8gpfp  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(144)

我有一个日期的字符向量格式为DDMMYYY**(millenium character省略)**,我必须转换为日期向量。

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年之后的几年里都不起作用,所以我认为必须有一个更好的方法来进行这种转换。

hmmo2u0o

hmmo2u0o1#

注解中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"
kpbwa7wx

kpbwa7wx2#

以下是另一种方法:

library(dplyr)
library(lubridate)
my_func <- function(x){
  value <- substr(x, 5,5)
  x <- case_when(value == "1" | value == "9" ~ paste0(substring(x, 1, 4), "19", substring(x, 6)),
                 value == "0"  ~ paste0(substring(x, 1, 4), "20", substring(x, 6)),
                 TRUE ~ NA_character_)
  x <- gsub("(.{2})(.{2})(.{2})", "\\1-\\2-\\3", x)
  x <- dmy(x)
  return(x)
}

my_func(dates)

 [1] "1988-10-04" "2009-05-23"
 [3] "1964-11-11" "2015-04-02"
 [5] "2015-03-18" "2015-09-07"
 [7] "2015-01-04" "2015-12-20"
 [9] "1958-04-30" "2015-05-12"

相关问题