2016-07-26 2 views
0

Ich spiele mit Datetime-Sachen in R herum und kann nicht herausfinden, wie man den Zeitursprung ändert, um ältere Daten zu akzeptieren. Zum Beispiel:Wie behandelt man ein mehrdeutiges Jahrhundert in Datetime-Objekten?

vals <- as.character(60:70) 
as.POSIXct(vals, origin="1900-01-01", format = "%y") 
# [1] "2060-07-25 EDT" "2061-07-25 EDT" "2062-07-25 EDT" "2063-07-25 EDT" 
# [5] "2064-07-25 EDT" "2065-07-25 EDT" "2066-07-25 EDT" "2067-07-25 EDT" 
# [9] "2068-07-25 EDT" "1969-07-25 EDT" "1970-07-25 EDT" 

Ist es möglich, den Ursprung so einzustellen, dass as.POSIXct 1960 für eine Eingabe von „60“ zurück? Was ist der beste Weg, um ein mehrdeutiges Jahrhundert zu bewältigen?

Antwort

1

Sie können as.POSIXct 1960 für einen Eingang von "60" nicht zurückgeben. Siehe ?strptime:

‘%y’ Year without century (00-99). On input, values 00 to 68 are 
     prefixed by 20 and 69 to 99 by 19 - that is the behaviour 
     specified by the 2004 and 2008 POSIX standards, but they do 
     also say ‘it is expected that in a future version the default 
     century inferred from a 2-digit year will change’. 

Sie müssen das Jahrhundert auf die Zeichenfolge vorangestellt wird und verwenden Sie das "%Y" Format, wenn Sie mit as.POSIXct anderes Verhalten möchten.

vals <- as.character(60:70) 
as.POSIXct(paste0("19",vals), format = "%Y") 

Wenn einige der zweistelligen Daten nach 2000 sind, können Sie ifelse oder etwas ähnliches verwenden, um ein anderes Jahrhundert vorangestellt wird.

newvals <- paste0(ifelse(vals < "20", "20", "19"), vals) 
+0

Ich habe das gelesen - ich habe einfach angenommen, dass es eine Möglichkeit geben würde, das Standardverhalten zu ändern. – dayne

+0

@dayne: Es gibt normalerweise keine Möglichkeit, Verhalten zu unterwandern, das internationalen Standards entspricht. –

1

Angenommen, Sie könnten einige Jahre größer als 2000, vor 19 würde der Vektor möglicherweise nicht wünschenswert sein.

In diesem Fall könnte die Subtraktion von 100 Jahren besser sein.

library(lubridate) 
vals <- as.character(60:70) 
vals <- as.POSIXct(vals, origin="1900-01-01", format = "%y") 
vals[year(vals)>2059] <- vals[year(vals)>2059] - years(100) 
vals 

[1] "1960-07-25 CDT" "1961-07-25 CDT" "1962-07-25 CDT" 
[4] "1963-07-25 CDT" "1964-07-25 CDT" "1965-07-25 CDT" 
[7] "1966-07-25 CDT" "1967-07-25 CDT" "1968-07-25 CDT" 
[10] "1969-07-25 CDT" "1970-07-25 CDT" 
+0

Cleverer Hack. Ich habe das "lubridate" -Paket noch gar nicht angeschaut. – dayne

+0

Viele von uns, die mit Hadley gelernt haben, kennen den hadleyverse besser als Base R. 'lubridate' ist ein guter. – shayaa

+1

Das funktioniert nur, wenn der POSIX-Standard unverändert bleibt, aber '? Strptime' sagt, dass sich das irgendwann in der Zukunft ändern wird. –

Verwandte Themen