Fügen Sie das korrekte Jahrhundert den Daten mit dem Jahr hinzu, das als “Jahr ohne Jahrhundert”,% y, angegeben ist

Ich habe eine Datei mit Geburtstagen in %d%b%y Format. Einige z.

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

Ich habe versucht, das Datum als neu zu formatieren

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

und das ist das Ergebnis

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

Das sind Geburtstage und ich sehe 2054. Von dieser Seite sehe ich, dass Jahr Werte zwischen 00 und 68 als 20 für Jahrhundert codiert werden. Gibt es eine Möglichkeit, dies umzuschalten, in meinem Fall möchte ich nur 00 bis 12 als 20 codiert werden.

1) chron . Der Chron verwendet standardmäßig 30, so konvertiert er sie zuerst in Datum (da chron diese Datumsangaben nicht lesen kann), um in Zeichen mit zweistelligen Jahren in ein Format umzuformatieren, das der Chron verstehen kann, und schließlich zurück zu Datum.

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

Das ergibt einen Cutoff von 30, aber wir können einen Cutoff von 13 mit chron's chron.year.expand Option erhalten:

 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, ...) } ) 

und dann die ursprüngliche Konvertierung wiederholen. Nehmen wir zum Beispiel an, dass wir diese Option bereits ausgeführt haben, erhalten wir mit unserem xx folgendes:

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

2) nur Datum . Hier ist eine Alternative, die nicht chron verwendet. Vielleicht möchten Sie "2012-12-31" durch Sys.Date() ersetzen, wenn die Idee ist, dass zukünftige Daten eigentlich vor 100 Jahren gesetzt werden sollen:

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

BEARBEITEN: Datum nur Lösung hinzugefügt.

Siehe Antwort von verwandtem Thread :

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