2017-02-28 1 views
1

In R können Sie einfach den cycle Teil eines Zeitreihenobjekts mit der cycle() Funktion zurückgeben. z.B.Wie gibst du den Teil "Periode" in eine Zeitreihe zurück?

> series <- ts(1:50, frequency = 4, start = 2011) 
> cycle(series) 
    Qtr1 Qtr2 Qtr3 Qtr4 
2011 1 2 3 4 
2012 1 2 3 4 
2013 1 2 3 4 
2014 1 2 3 4 
2015 1 2 3 4 
2016 1 2 3 4 
2017 1 2 3 4 
2018 1 2 3 4 
2019 1 2 3 4 
2020 1 2 3 4 
2021 1 2 3 4 
2022 1 2 3 4 
2023 1 2 

Allerdings habe ich nie in der Lage gewesen, eine schöne, saubere Art und Weise, um herauszufinden, die „Zeit“ Teil zurückzukehren (z. B. das Jahr für die vierteljährlichen Daten). In den meisten Fällen können Sie eine einfache tun:

> floor(time(series)) 
    Qtr1 Qtr2 Qtr3 Qtr4 
2011 2011 2011 2011 2011 
2012 2012 2012 2012 2012 
2013 2013 2013 2013 2013 
2014 2014 2014 2014 2014 
2015 2015 2015 2015 2015 
2016 2016 2016 2016 2016 
2017 2017 2017 2017 2017 
2018 2018 2018 2018 2018 
2019 2019 2019 2019 2019 
2020 2020 2020 2020 2020 
2021 2021 2021 2021 2021 
2022 2022 2022 2022 2022 
2023 2023 2023 

das Jahr zu erhalten, jedoch habe ich festgestellt, dass für einige Daten (in der Regel Hochfrequenzdaten), bewirkt, dass der errors in floating point precision den ersten Zeitpunkt von einer Periode zur geben Sie den Wert der vorherigen Periode zurück (z. B. wurde er so gespeichert wie 2010.9999999 anstatt 2011, also floor() gibt 2010 zurück). Wir können künstlich das Problem in die Daten einführen Sie folgendermaßen vorgehen:

> seriesprec <- ts(1:50, frequency = 4, start = 2010.999999999999) 
> floor(time(seriesprec)) 
    Qtr1 Qtr2 Qtr3 Qtr4 
2011 2010 2011 2011 2011 
2012 2011 2012 2012 2012 
2013 2012 2013 2013 2013 
2014 2013 2014 2014 2014 
2015 2014 2015 2015 2015 
2016 2015 2016 2016 2016 
2017 2016 2017 2017 2017 
2018 2017 2018 2018 2018 
2019 2018 2019 2019 2019 
2020 2019 2020 2020 2020 
2021 2020 2021 2021 2021 
2022 2021 2022 2022 2022 
2023 2022 2023  

Jetzt sehen wir die Gleitkommagenauigkeit wird die zurückgegebene Wert Abwerfen obwohl:

> all.equal(time(seriesprec), time(series)) 
[1] TRUE 

Die einfachste Lösung, die ich gefunden habe, dass scheint diese Grenzfälle zu kümmern ist:

round(time(series) - (cycle(series) - 1)*deltat(series)) 

aber dies scheint wie maßen komplizierter Code für eine sehr einfache Aufgabe. Insbesondere wenn cycle() eine Basisfunktion ist, scheint es, dass es eine andere Basisfunktion geben sollte, um die andere Hälfte der Zeitdefinition zurückzugeben.

By the way, ich bin die Pakete bewusst, die Termine und Zeiten handhaben sehr schön, aber da viele der Dinge, die ich schließlich in Pakete eingewickelt tun bekommen, würde ich eher nicht so etwas wie lubridate als Abhängigkeit für etwas hinzufügen, dass kann mit einer (sehr umständlichen) Zeile Basis R Code gelöst werden.

Vielen Dank!

+0

'trunc (time (ldeaths))' –

+0

@d verwenden.b Das von 'time()' für ein Zeitreihenobjekt zurückgegebene Objekt gehört nicht zur Klasse 'timeDate', so dass die Fähigkeit von 'trunc', auf eine bestimmte Zeitgenauigkeit zu runden, nicht hilft. Stattdessen funktioniert es wie 'floor()' in diesem Kontext und hat die gleichen Gleitkommaprozisionsprobleme wie diese Funktion. – Barker

+0

Fügen Sie einfach eine kleine Menge hinzu, 'floor (time (series) + eps)' Sie können jede vernünftige kleine Zahl als 'eps' verwenden. 'eps <- deltat (series)/2' ist eine allgemeine Möglichkeit. –

Antwort

1

Eine Möglichkeit besteht darin, einen geeigneten kleinen Wert zu time vor der Einnahme floor oder trunc hinzuzufügen. Als G.Grothiedieck erwähnt in den Kommentaren, deltat(series)/2 kann ein geeigneter kleiner Wert sein. Und offset mit time kann eine Möglichkeit sein, diesen kleinen Wert hinzuzufügen. Von ?time

Offset

verwendet werden kann, um anzuzeigen, wenn die Probenahme in der Zeit Einheit nimmt. 0 (Standard) zeigt den Beginn der Einheit an, 0,5 die Mitte und 1 das Ende des Intervalls.

Hinzufügen offset = 0.5 zu time entspricht deltat(series)/2 zu addieren.

Also, sollten Sie in der Lage sein, den richtigen Zeitraum Teil zu bekommen

floor(time(seriesprec, offset = 0.5)) 
Verwandte Themen