Adicionar século correto às datas com ano fornecido como “Ano sem século”,% y

Eu tenho um arquivo com aniversários no formato %d%b%y . Alguns por exemplo.

 # "01DEC71" "01AUG54" "01APR81" "01MAY81" "01SEP83" "01FEB59" 

Eu tentei reformatar a data como

 o108$fmtbirth <- format(as.Date(o108$birth, "%d%b%y"), "%Y/%m/%d") 

e este é o resultado

 # "1971/12/01" "2054/08/01" "1981/04/01" "1981/05/01" "1983/09/01" "2059/02/01" 

Estes são aniversários e eu vejo 2054. Desta página eu vejo que os valores de ano entre 00 e 68 são codificados como 20 para o século. Existe uma maneira de alternar isso, no meu caso eu quero apenas 00-12 para ser codificado como 20.

1) chron . chron usa 30 por padrão, então isso irá convertê-los convertendo primeiro em Data (já que o cron não pode ler esses tipos de datas) reformatando para caracteres com anos de dois dígitos em um formato que o cron entenda e finalmente volte para Date.

 library(chron) xx <- c("01AUG11", "01AUG12", "01AUG13") # sample data as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) 

Isso dá um ponto de corte de 30, mas podemos obter um ponto de corte de 13 usando a opção chron.year.expand de chron.year.expand :

 library(chron) options(chron.year.expand = function (y, cut.off = 12, century = c(1900, 2000), ...) { chron:::year.expand(y, cut.off = cut.off, century = century, ...) } ) 

e depois repetindo a conversão original. Por exemplo, supondo que já tivéssemos executado essa declaração de opções, obteríamos o seguinte com nosso xx :

 > as.Date(chron(format(as.Date(xx, "%d%b%y"), "%m/%d/%y"))) [1] "2011-08-01" "2012-08-01" "1913-08-01" 

2) apenas data . Aqui está uma alternativa que não usa chron. Você pode querer replace "2012-12-31" por Sys.Date() se a idéia é que, do contrário, datas futuras devem ser definidas 100 anos atrás:

 d <- as.Date(xx, "%d%b%y") as.Date(ifelse(d > "2012-12-31", format(d, "19%y-%m-%d"), format(d))) 

EDIT: adicionado apenas solução de data.

Veja a resposta do tópico relacionado :

 format(as.Date("65-05-14", "%y-%m-%d"), "19%y-%m-%d")