2012-02-29 7 views
13

Tengo un archivo con cumpleaños en el formato %d%b%y. Algunos ej.Agregue el siglo correcto a las fechas con el año provisto como "Año sin siglo",% y

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

Me trataron de cambiar el formato de la fecha como

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

y este es el resultado

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

Estos son los cumpleaños y veo 2054. A partir de este page veo que los valores de año entre 00 y 68 están codificados como 20 por siglo. ¿Hay alguna manera de alternar esto? En mi caso, quiero que solo 00 a 12 se codifique como 20.

Respuesta

21

1) chron. chron usa 30 de forma predeterminada, por lo que los convertirá primero en Date (dado que chron no puede leer ese tipo de fechas) reformateando a caracteres con dos dígitos en un formato que chron pueda comprender y, finalmente, vuelva a Date.

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

que le da un punto de corte de 30, pero podemos conseguir un punto de corte de 13, utilizando la opción de Chron 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, ...) 
    } 
) 

y luego repetir la conversión original. Por ejemplo suponiendo que habíamos ejecutar esta declaración opciones ya que se pueden conseguir lo siguiente con nuestra 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) Sólo fecha. Aquí hay una alternativa que no usa chron. Es posible que desee reemplazar "2012-12-31" con Sys.Date() si la idea es que de lo contrario las futuras fechas son realmente de engaste 100 años 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: añadido Fecha única solución.

+4

+1 por Fecha única solución – russellpierce

+0

1 sin embargo, una advertencia a la fecha única solución: la salida ya no es una clase Date, sino un personaje, por lo que la aritmética requerirán retro-transformando la salida. Oy vey. – AdamO

+0

Tiene la forma 'as.Date (...)' así que claramente es de la clase 'Date'. –

11

Ver respuesta de related thread:

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