2012-03-26 3 views
3

Ich möchte die ersten 5 Minuten Zeitreihen Daten für jeden Tag aus winzigen Daten, aber die ersten 5 Minuten nicht gleichzeitig auftreten Zeit jeden Tag so etwas wie xtsobj["T09:00/T09:05"] verwenden würde seit Beginn der ersten 5 Minuten Änderungen nicht funktionieren. d.h. manchmal beginnt es um 9.20 Uhr oder irgendeine andere zufällige Zeit am Morgen anstelle von 9.00 Uhr.Erhalten oder Untermenge der ersten 5 Minuten eines jeden Tages von Daten aus einem xts

Bisher konnte ich für jeden Tag die erste Minute der Teilmenge aus einer Funktion wie mit:

k <- diff(index(xtsobj))> 10000 

xtsobj[c(1, which(k)+1)] 

dh Lücken in den Daten zu finden, die größer als 10.000 Sekunden, aber davon gehen Die ersten 5 Minuten eines jeden Tages zu finden, erweist sich als schwieriger, da die Daten nicht immer gleichmäßig verteilt sind. I.e. zwischen dem ersten Minute und 5 Minuten dort konnte von 2 Zeile 5 Reihen und damit etwas unter Verwendung von wie:

xtsobj[c(1, which(k)+6)] 

und dann die Ergebnisse zusammen binden

ist nicht immer korrekt. Ich hatte gehofft, dass eine Funktion wie "first" verwendet werden könnte, aber war nicht sicher, wie dies für mehrere Tage zu tun ist, vielleicht könnte dies die optimale Lösung sein. Gibt es eine bessere Möglichkeit, diese Informationen zu erhalten?

Vielen Dank für die Stackoverflow-Community im Voraus.

Antwort

4

split(xtsobj, "days") eine Liste mit einem XTS-Objekt für jeden Tag zu schaffen.

Dann können Sie head an den jeweiligen Tag gelten

lapply(split(xtsobj, "days"), head, 5) 

oder allgemeiner

lapply(split(xtsobj, "days"), function(x) { 
    x[1:5, ] 
}) 

Schließlich können Sie die Tage rbind wieder zusammen, wenn Sie wollen.

do.call(rbind, lapply(split(xtsobj, "days"), function(x) x[1:5, ])) 
+0

Das ist erstaunlich, vielen Dank !!!! es funktioniert perfekt! –

2

Was Sie das Paket lubridate verwenden, zunächst den Ausgangspunkt jeden Tag herausfinden, dass Sie nach Art zufällig ändert, und verwenden Sie dann die Funktion minutes

So wäre es etwa so aussehen:

five_minutes_after = starting_point_each_day + minutes(5) 

Dann können Sie die üblichen Teilmenge von xts verwenden, etwas zu tun wie:

5_min_period = paste(starting_point_each_day,five_minutes_after,sep='/') 

xtsobj[5_min_period] 

Edit:

@Joshua Ich denke, das funktioniert, bei diesem Beispiel aussehen:

library(lubridate) 
x <- xts(cumsum(rnorm(20, 0, 0.1)), Sys.time() - seq(60,1200,60)) 

starting_point_each_day= index(x[1]) 
five_minutes_after = index(x[1]) + minutes(5) 
five_min_period = paste(starting_point_each_day,five_minutes_after,sep='/') 

x[five_min_period] 

In meinem vorherigen Beispiel machte ich einen Fehler, ich legte den five_min_period zwischen Anführungszeichen. War das, was du Joshua aufgezeigt hast? Vielleicht auch der Ausgangspunkt ist nicht erforderlich, nur:

until5min=paste('/',five_minutes_after,sep="") 
x[until5min] 
+0

'xtsobj ['5_min_period']' wird nicht funktionieren. Sie können nur XTS-Objekte mit sehr spezifischen Stringtypen unterteilen. –

+0

@JoshuaUlrich Ich denke, es funktioniert – aatrujillob

+0

Ich sagte 'Xtsobj ['5_min_period']' wird nicht funktionieren, weil ''5_min_period'' ist keine Zeichenfolge XTS wird erkennen. Freut mich, dass Sie den Fehler korrigiert haben. –

Verwandte Themen