2017-01-12 3 views
1

Apologies interpolieren, wenn dies eine offensichtliche Frage, aber ich bin neu in R, auf 10 Jahren mit SASR - Zeitreihen zu gleichen Intervall aber neue Zeitpunkte

Ich habe zwei Datendateien von Messungen verbracht haben - zweite Intervalle, aber nicht zu genau denselben Zeitpunkten. Ich möchte eine der Zeitreihen konvertieren, um die Zeiten der anderen zu vergleichen, und ihre Werte mit linearer Interpolation anpassen. In SAS konnte ich das ziemlich schnell mit proc expand machen, aber ich finde nichts vergleichbares Paket in R (ich habe mir Zoo und xts angeschaut).

Um zu zeigen, was ich meine, hier sind Schnipsel meiner beiden Dateien. In diesem Fall befindet sich eine Zeitreihe auf der 3 und die andere auf der 2. In diesem speziellen Fall ist der 1-Sekunden-Unterschied wahrscheinlich trivial, aber dies ist ein Problem, mit dem ich bei meiner Arbeit viel zu tun habe, und deshalb würde ich gerne wissen, ob es eine einfache Möglichkeit gibt, die Werte in der zweiter Datensatz auch auf den

Datum, Zeit, Wert

3-Nov-16,13 von 3 zu sein: 15: 53,264.651

3-Nov-16,13: 16: 03,264.58

3-Nov-16,13: 16: 13,264,368

3-Nov-16,13: 16: 23,264,273

3-Nov-16,13: 16: 33,264.391

11/3/16,1: 15: 52 PM, 10,1

11/3/16,1: 16: 02.00, 10,1

11/3/16,1: 16: 12.00, 10,1

11/3/16,1: 16: 22 PM, 10,1

11/3/16,1: 16 : 32 PM, 10.1

+0

Erstellen Sie eine Polynom Spline-Interpolation und neu zu den neuen Zeitpunkten? – smci

Antwort

2

Sie können die Verwendung 'ca.' -Funktion. Hier ist ein Beispiel mit Ihren Daten:

> input <- read.table(text = "11/3/16,1:15:52 PM,10.1 
+ 
+ 11/3/16,1:16:02 PM,10.1 
+ 
+ 11/3/16,1:16:12 PM,10.1 
+ 
+ 11/3/16,1:16:22 PM,10.1 
+ 
+ 11/3/16,1:16:32 PM,10.1", as.is = TRUE, sep = ',') 
> 
> # convert the date 
> input$time <- as.POSIXct(input$V2, format = "%I:%M:%S %p") 
> library(lubridate) 
> 
> input$newtime <- input$time 
> 
> first <- read.table(text = "3-Nov-16,13:15:53,264.651 
+ 
+ 3-Nov-16,13:16:03,264.58 
+ 
+ 3-Nov-16,13:16:13,264.368 
+ 
+ 3-Nov-16,13:16:23,264.273 
+ 
+ 3-Nov-16,13:16:33,264.391", as.is = TRUE, sep = ',') 
> first$time <- as.POSIXct(first$V2, format = "%H:%M:%S") 
> 
> # use "approx" to interprete values 
> # find values for times in "input" since "first" has different values 
> input$result <- approx(first$time, 
+      first$V3, 
+      xout = input$time, 
+      rule = 2 
+      )$y 
>       
> 
> input 
     V1   V2 V3    time    newtime result 
1 11/3/16 1:15:52 PM 10.1 2017-01-11 13:15:52 2017-01-11 13:15:52 264.6510 
2 11/3/16 1:16:02 PM 10.1 2017-01-11 13:16:02 2017-01-11 13:16:02 264.5871 
3 11/3/16 1:16:12 PM 10.1 2017-01-11 13:16:12 2017-01-11 13:16:12 264.3892 
4 11/3/16 1:16:22 PM 10.1 2017-01-11 13:16:22 2017-01-11 13:16:22 264.2825 
5 11/3/16 1:16:32 PM 10.1 2017-01-11 13:16:32 2017-01-11 13:16:32 264.3792 
> first 
     V1  V2  V3    time 
1 3-Nov-16 13:15:53 264.651 2017-01-11 13:15:53 
2 3-Nov-16 13:16:03 264.580 2017-01-11 13:16:03 
3 3-Nov-16 13:16:13 264.368 2017-01-11 13:16:13 
4 3-Nov-16 13:16:23 264.273 2017-01-11 13:16:23 
5 3-Nov-16 13:16:33 264.391 2017-01-11 13:16:33 
> 
+0

Danke! Genau das habe ich gesucht – SEGilman

0

Ich entschuldige mich ze, dass ich ein bisschen faul bin, den Input auszuwerten, wie Sie gefragt haben. Ich lerne immer noch R. Ich frage mich, ob dieses Stück Code dein grundlegendes Problem löst.

Der Algorithmus ist einfach

ich alle Zeit zu Unix Zeit ändern, die die Anzahl der Sekunden seit Epoche ist.

I verwenden Unix-Zeit als x und die zweite Zahl als y

I neue Datenpunkte zu erstellen, basierend auf dem zweiten Satz von Datumzeit als Unix-Zeit.

toUnixTime <- function(dateobj){ 
    return (as.numeric(as.POSIXct(dateobj, origin="1970-01-01"))) 
} 

toDateTime <- function(unixtime){ 
return (as.POSIXct(unixtime, origin="1970-01-01")) 
} 
toUnix <- function(datetime){ 
return (as.numeric(strptime(datetime, "%d-%b-%y,%H:%M:%S"))) 
} 
toUnix2 <- function(datetime){ 
return (as.numeric(strptime(datetime, "%m/%d/%y,%I:%M:%S %p"))) 
} 
main <- function(){ 
x <- c(toUnix("3-Nov-16,13:15:53"),toUnix("3-Nov-16,13:16:03:53")) 
y <- c(264.651,264.58) 
f <- approxfun(x,y) 
f(toUnix2("11/3/16,1:16:02 PM")) 
} 
main() 

Diese gibt

264.5871 for 11/3/16,1:16:02 PM 
Verwandte Themen