2017-10-15 11 views
0

Ich habe, was hoffentlich eine einfache Frage ist. Ich habe ein xts Objekt ähnlich den folgenden:Führen Sie Operationen am selben Tag mit XTS in R

     | MarketPrice | 
---------------------------------------- 
2007-05-04 10:15:33.546 | 5.32  | 
---------------------------------------- 
2007-05-04 10:16:42.100 | 5.31  | 
---------------------------------------- 
2007-05-04 10:17:27.546 | NA   | 
---------------------------------------- 
2007-05-04 10:20:50.871 | 5.35  | 
---------------------------------------- 
2007-05-04 10:21:38.652 | 5.37  | 

Grundsätzlich würde Ich mag den MarketPrice Index unmittelbar vor einem Zeitpunkt zu finden, während auch NA Werte ommitting. Nehmen wir an, wir beginnen zum Zeitpunkt 2007-05-04 10:20:50.871 mit einem Index von 4 im Objekt. Das bedeutet also, dass der Marktpreis unmittelbar vor dieser Zeit 5.31 ist, der einen Index von 2 im Objekt hat. Um diese Aufgabe zu erfüllen habe ich eine ähnliche Funktion wie die folgende geschrieben:

MPFunction <- function(t,df){ 

ind <- t 
while(t>1){ 
    t=t-1 
    if ((index(df[t]) != index(df[ind])) && !(is.na(df[t,"MarketPrice"]))) { 

    return(t) 
    } 
} 
} 

Und dies führt die Aufgabe, da die erste Bedingung in der Anweisung überprüft, wenn sie an die Zeiten in dem Index des xts Objekt stellen Sie sicher, sind unterschiedlich und die zweite Bedingung überprüft, um sicherzustellen, dass es keinen NA Wert in der Spalte MarketPrice gibt.

Allerdings stoße ich jetzt auf ein Problem, wenn ich mir mehrere Tage anschaue. Lassen Sie uns sagen, dass ich jetzt ein xts Gegenstand haben wie folgt:

      | MarketPrice | 
    ---------------------------------------- 
    2007-05-03 16:59:58.921 | 5.32  | 
    ---------------------------------------- 
    2007-05-04 10:12:27.546 | NA   | 
    ---------------------------------------- 
    2007-05-04 10:20:50.871 | 5.35  | 
    ---------------------------------------- 

Wenn ich bei Index 3 (dh zum Zeitpunkt 2007-05-04 10:20:50.871), dann starten, wenn ich den ersten Index vor dieser Zeit finden wollen, die keine NA hat Wert in der MarketPrice Spalte, wird es zum Index 1 gehen, der 2007-05-03 16:59:58.921 ist. Das Problem ist jedoch, dass dies an einem anderen Tag ist, und ich möchte sicherstellen, dass ich nur den Index der MarketPrice Werte am selben Tag extrahiere.

Grundsätzlich habe ich mich gefragt, ob es eine schnelle Änderung gibt, die ich zu meinem MPFunction oben in der IF-Anweisung machen kann, die mir erlauben wird, den Index des MarketPrice vom vorherigen Tag zu finden. Außerdem möchte ich das xts Objekt nicht am Tag aufteilen, da es die Dinge ziemlich kompliziert machen würde, wenn ich es tun würde.

Jetzt habe ich bereits einige Idee, wie man das löst (wie die Verwendung der strptime Funktion, um Daten usw. zu überprüfen), aber das sind alle zeitaufwendigen Methoden, so dass ich gehofft hatte, eine Methode zu finden, die viel ist schneller, also wenn jemand irgendwelche Ideen hat, würde ich es begrüßen. Danke im Voraus.

Antwort

1

Klingt wie Sie tatsächlich split.xts verwenden möchten, und rekombinieren die Ergebnisse (warum ist eine Komplikation mit Split Es sollte nicht sein, auch bei großen Mengen von Tickdaten in jeden Tag?):

zz=xts(order.by = as.POSIXct(c("2007-05-03 09:59:58.921", 
           "2007-05-03 10:03:58.921", 
           "2007-05-03 12:03:58.921" 
        "2007-05-04 10:15:33.546", 
       "2007-05-04 10:16:42.100", 
       "2007-05-04 10:17:27.546", 
       "2007-05-04 10:20:50.871", 
       "2007-05-04 10:21:38.652")), 
    x = c(3, 4, 9, 5.32, 5.31, NA, 5.35, 5.37), dimnames = list(NULL, "MarketPrice")) 

> zz 
#      MarketPrice 
# 2007-05-03 09:59:58  3.00 
# 2007-05-03 10:03:58  4.00 
# 2007-05-04 10:15:33  5.32 
# 2007-05-04 10:16:42  5.31 
# 2007-05-04 10:17:27   NA 
# 2007-05-04 10:20:50  5.35 
# 2007-05-04 10:21:38  5.37 


MPFunction <- function(x, time_window = "T10/T10:16:40") { 
    #last(x[time_window, which.i= TRUE]) # get the index? 
    # last returns the last row in the group selected: 
    #last(x[time_window,]) 
    u <- x[time_window, which.i = TRUE] 

    if (length(u) > 0) { 
    # Get index which is not an NA value: 
    u.na <- which(is.na(x[time_window, "MarketPrice"])) 
    u2 <- u[!u %in% u.na] 
    if (length(u2) > 0) { 
     v <- xts(order.by = end(x[last(u2)]), x = last(u2), dimnames = list(NULL, "index.i"))   
    } else { 
     v <- NULL  
    } 
    } else { 
    v <- NULL 
    } 
    v 
} 

# use T0/ as the start of the time window in each day for getting the index value by default. You can change this though. 
chosen_window = "T0/T10:17:29" 

by_day <- lapply(split(zz, f = "day"), FUN = MPFunction, time_window = chosen_window) 

rr <- do.call(rbind, by_day) 

> rr 
#      index.i 
# 2007-05-03 10:03:58  2 
# 2007-05-04 10:16:42  2 

Wenn an einem Tag keine Werte in einem time_window von Interesse sind, erhalten Sie für diesen Tag NULL, und nichts in der Ausgabe (rr) für diesen Tag

zurückgegeben
Verwandte Themen