2015-04-17 6 views
5

Ich versuche, vom Dezimalformat (Rückgabetyp von cpts.ts() aus dem Changepoint-Paket) in das normale Datumsformat% Y-% m-% d zu ändern. Beispiel:Wie wird das dezimale Datumsformat (z. B. 2011.580) in das normale Datumsformat konvertiert?

cpts.ts(myTimeSeries.BinSeg) 
[1] 2001.667 2004.083 2008.750 2011.583 2011.917 

Die aktuellen Termine sind irgendwann um August 2001, Januar 2004 September 2008 Juni/Juli 2011 und Dezember 2011 (ich weiß sie nicht genau, ich lese sie eine Grafik aus).

Ich kann nicht scheinen, eine Standardmethode zu finden, dieses Format zurück in das übliche Datumsformat umzuwandeln.

Kann mir jemand helfen?

Dank

Antwort

7

leicht unterschiedliche Ergebnisse mit lubridate:

library(lubridate) 
decimals <- c(2001.667, 2004.083, 2008.750, 2011.583, 2011.917) 

format(date_decimal(decimals), "%Y-%m-%d") 
# [1] "2001-09-01" "2004-01-31" "2008-10-01" "2011-08-01" "2011-12-01" 
4
> foo <- c(2001.667,2004.083,2008.750,2011.583,2011.917) 
> as.Date(paste(trunc(foo),round((foo-trunc(foo))*365,0)),"%Y %j") 
[1] "2001-08-31" "2004-01-30" "2008-09-30" "2011-08-01" "2011-12-01" 

Blick auf ?as.Date und seine format Parameter, die Sie ?strptime leiten wird, von dem ich das %j Spezifikationsformat nahm.

Sie müssen möglicherweise für einige Eckfälle anpassen, wie 1. Januar.

+1

Sie haben recht, diese Methode behandelt nicht den ersten Januar - es gibt nur 'NA' zurück, wenn es einen ersten Januar gibt! – SiKiHe

4

Für diejenigen, die eine Basis R Lösung für dieses Problem unter Berücksichtigung der Kern lubridate des date_decimal ist im Wesentlichen:

start <- as.POSIXct(paste0(trunc(foo), "/01/01"), tz="UTC") 
end <- as.POSIXct(paste0(trunc(foo)+1,"/01/01"), tz="UTC") 
start + (difftime(end, start, units="secs") * (foo - trunc(foo))) 

D.h. - setzen Sie ein start Datum zu Beginn des Jahres, in dem das Datum auftritt, setzen Sie ein end Datum zu Beginn des folgenden Jahres, multiplizieren Sie die Differenz zwischen Anfang und Ende mit dem Bruch des abgelaufenen Jahres, addieren Sie diese Differenz zurück der Anfang. Dies berücksichtigt Schaltjahre und wird für den 1. Januar angemessen funktionieren.