2012-02-29 18 views
13

Ho un file con i compleanni nel formato %d%b%y. Alcuni ad es.Aggiungere il secolo corretto alle date con anno fornito come "Anno senza secolo",% y

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

Ho provato a riformattare la data come

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

e questo è il risultato

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

Questi sono i compleanni e vedo 2054. Da questo page vedo che i valori di anno tra 00 e 68 sono codificati come 20 per secolo. C'è un modo per attivare questo, nel mio caso voglio solo da 00 a 12 per essere codificato come 20.

risposta

21

1) chron. chron usa 30 di default, quindi questo converte la conversione da prima a Data (dal momento che il chron non può leggere quei tipi di date) riformattando il personaggio con due anni in un formato che Chron può comprendere e infine tornare a Data.

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

che dà un cut-off di 30, ma siamo in grado di ottenere un taglio del 13 utilizzando l'opzione di 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, ...) 
    } 
) 

e poi ripetendo la conversione originale. Per esempio supponendo che avevamo eseguire questa affermazione opzioni già che avremmo avuto il seguente con il nostro 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) Solo data. Ecco un'alternativa che non usa il chron. Si potrebbe desidera sostituire "2012-12-31" con Sys.Date() se l'idea è che le date altrimenti le future sono davvero da impostare 100 anni fa:

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

EDIT: aggiunto Data unica soluzione.

+4

+1 per data unica soluzione – russellpierce

+0

+1 comunque un avvertimento alla Data unica soluzione: l'uscita non è più una classe Date, ma un personaggio, in modo aritmetico richiederanno back-transforming dell'output. Oy Vey. – AdamO

+0

È nella forma 'as.Date (...)' così chiaramente è della classe 'Date'. –

11

See risposta da related thread:

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