2012-03-28 4 views
4

Ich versuche, über XTS, über den Tag hinaus einstellbare Zeitserien zu generieren.Wie extrahiere ich/Teilmenge Tag + 0 bis Tag + 1 Index Zeiten von winzigen Daten über Xts in R?

Zum Beispiel habe ich eine winzige Zeitreihe (mts), die 24 Stunden pro Tag über 10 Jahre generiert wird. Ich möchte sagen, jeder (08:30 Uhr t + 0 bis 13:30 t + 1) Zeitraum für jeden "Tag" in der Zeitreihe.

dies von 08:30 zu tun, sagen wir, 16:00 Uhr am selben Tag mit XTS ist trivial und gut auf Stack angesprochen: das heißt mts["T08:29:59/T16:01:00"]

Aber wie schreibe ich das Äquivalent in dem der Endpunkt der Zeitreihen zu Teilmenge ist eine Zeit, die am nächsten Tag auftritt?

Alle Gedanken sehr geschätzt.

+0

8:30 bis 13:30 Uhr Am nächsten Tag, für jeden Tag, werden ALLE Daten zwischen 8:30 am ersten Tag und 13:30 am letzten Tag sein. Wenn Sie es nur am 1. Januar 2012 machen wollen, ist es 'mts [" 2012-01-01 08: 30/2012-01-02 13:30 "]' – GSee

+0

Ich freue mich darauf, es zu tun bestimmte Unterperiode für alle Tage innerhalb der 10-Jahres-Reihe. Entschuldigung, wenn ich das in meiner ursprünglichen Frage nicht klar gemacht habe –

+0

Richtig, aber da sich die Teilzeiträume überschneiden, bleiben alle Daten zwischen dem ersten Tag um 8:30 Uhr und dem letzten Tag um 13:30 Uhr. – GSee

Antwort

4

Dadurch wird eine Liste erstellt, in der jedes Element der Liste ein xts-Objekt ist, das um 8:30 beginnt und am folgenden Tag um 13:30 endet.

D <- split(mts, "days") 
mts.days <- lapply(seq_along(D) - 1, function(i) { 
    if (i > 0) rbind(D[[i]]["T08:30/T23:59:59"], D[[i + 1]]["T00:00:00/T13:30:00"]) 
}) 

Edit: Das Obige kann durch Hinzufügen von Namen in die Liste erweitert werden:

names(mts.days) <- as.Date(sapply(D, function(x) as.Date(start(x)))) 

Dann könnte man auf die Daten von 8.30 auf 2012-01-30 beziehen bis 13.30 Uhr auf 2012.01.31 wie diese

mts.days[["2012-01-30"]] 

Alternativ sind, wenn Sie nur einen „Tag“, gehen zu herausziehen Sie so etwas tun könnten (das folgt die gleiche Grundlogik)

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) { 
    string1 <- paste(Date, " ", t0, "/", Date, " 23:59:59", sep="") 
    string2 <- paste(as.Date(Date) + 1, " 00:00:00/", as.Date(Date) + 1, " ", t1, sep="") 
    rbind(mts[string1], mts[string2]) 
} 

Dann geben PullDay("2012-01-30") Ihnen die Teilmenge der Daten von 2012-01-30 08: 30/2012-01-31 13:30.

Edit2: Die

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) { 
    mts[paste(Date, " ", t0, "/", as.Date(Date) + 1, " ", t1, sep="")] 
} 

zu

vereinfacht, das mich führt zu glauben, dass ich immer noch nicht verstehen kann, was Sie wollen ...

+0

Dies ist eine interessante Lösung und geschickt zusammen, aber das Listenformat wird nicht für die Analyse funktionieren, die ich machen möchte. Genau wie in 'xts' möchte ich mit einer zusammenhängenden Zeitreihe dieser Untermenge enden. Vielen Dank für Ihren Versuch. sehr geschätzt. –

+0

Ich habe die Lösung dafür schon in 2 Kommentaren zur Verfügung gestellt. Wenn Sie denken, dass das, was Sie wollen, anders ist, als Ihre Daten überhaupt nicht zu untergliedern (außer am ersten und letzten Tag), dann erläutern Sie bitte, was Sie wollen. Möchten Sie doppelte Rounames von 8.30 bis 13.30 Uhr haben? jeden Tag? – GSee

+0

Ich fürchte, ich verstehe die Antwort, die Sie in Ihren anderen beiden Kommentaren angedeutet haben, nicht. Ich gehe davon aus, dass ich etwas nicht richtig kommuniziere. Die Zeitreihe ist nicht nur jede Minute von 08:30 Uhr bis 13:30 Uhr + 1 Uhr. Es ist eine 24-Stunden-Zeitreihe. Ich versuche nur, eine bestimmte Subperiode über die zwei Tage zu ziehen. Es könnte genauso gut von 09:00:00 heute bis 07:00:00 morgen sein. –

0

Ich war auf der Suche nach einer Antwort auf diese Frage selbst. GSee's Antwort ist perfekt. Da aber keine Daten zur Verfügung standen, habe ich meine eigene zusammengestellt. In dem Prozess angepasst immer leicht GSee-Code. Bitte wählen Sie GSee's Antwort, um Ihre Frage zu beantworten. Der folgende Code ist als Referenz, wenn jemand interessiert in dieser Frage ist (einschließlich meiner Zukunft selbst):

ein xts Objekt erstellen, das um 8:30 Uhr und endet um 13:30 Uhr über eine 3-Tage-Frist beginnt:

ticks <- 24*60*10 
mts <- xts(runif(ticks,0,1) 
       , order.by = seq(as.POSIXct("2013-01-01 08:30:00") 
           , as.POSIXct("2013-01-03 13:30:00") 
           , length = ticks 
          ) 
     ) 


D <- split(mts, "days") 
D[1]; D[2]; D[3]; 

GSEE die Funktionsdaten aus xts Objekt zu ziehen:

PullDay <- function(x, d0 = "2013-01-01", d1 = "2013-01-03", t0 = "08:30", t1 = "13:30") 
{ 
    x[paste0(d0, " ", t0, "/", d1, " ", t1)] 
} 

um die Daten von 8:30 Uhr am 2013.01.02 bis 01.30 Uhr ziehenam selben Tag, tun:

PullDay(mts, d0="2013-01-02", d1="2013-01-02") 

genauen Bereich angeben, tun:

PullDay(mts, d0="2013-01-02", d1="2013-01-02", t0="09:00", t1="09:01") 

Wenn jemand einen Fehler entdeckt, haben Sie die Erlaubnis zu bearbeiten und zu korrigieren.

+0

Mein [qmao-Paket] (https://r-forge.r-project.org/R/?group_id=1113) hat eine Art verwandter Funktionen: [TimeOfDaySubset] (https: //r-forge.r-project .org/scm/viewvc.php/pkg/qmao/R/ZeitOfDaySubset.R? view = Markup & root = twsinstrument), [ExcludeTimes] (https://r-forge.r-project.org/scm/viewvc.php/ pkg/qmao/R/ExcludeTimes.R? Ansicht = Markup & root = twsinstrument), [ExcludeDates] (https://r-forge.r-project.org/scm/viewvc.php/pkg/qmao/R/ExcludeDates.R ? view = markup & root = twsinstrument). – GSee

+0

Danke GSee, ich bin sehr neu in R und habe noch nicht viel erforscht. Ich werde darüber nachlesen. Vielen Dank! – PatrickT

Verwandte Themen