2016-12-16 5 views
0

Ich möchte r sagen, dass meine Daten in der UTC-Zeitzone sind, so dass ich sie dann auf America/New_York verschieben kann. Aber wenn ich indexTZ() verwende, ändert es die Zeiten.So ändern Sie Zeitzonen in xts

Ich möchte, dass die 16:00 UTC-Stunde eine 12:00 NY-Stunde wird.

test = read.zoo(paste0(datadir,"test_.csv"), 
        index = 1,FUN = as.POSIXct, header = T, sep = ",") 
    test = as.xts(test) 
    head(test) 


    > QQQ.Open QQQ.High QQQ.Low QQQ.Close QQQ.Volume 
    > 
    > 2016-09-10 16:38:00 4665.75 4665.75 4665.75 4665.75   1 
    > 2016-09-11 14:13:00 4665.75 4665.75 4665.75 4665.75   1 
    > 2016-09-11 22:01:00 4661.25 4667.25 4657.25 4666.75  932 
    > 2016-09-11 22:02:00 4666.75 4667.25 4663.25 4665.00  174 
    > 2016-09-11 22:03:00 4665.00 4667.00 4665.00 4666.50   66 


    indexTZ(test)<- "UTC" 
    head(test) 

        QQQ.Open QQQ.High QQQ.Low QQQ.Close QQQ.Volume 
2016-09-10 20:38:00 4665.75 4665.75 4665.75 4665.75   1 
2016-09-11 18:13:00 4665.75 4665.75 4665.75 4665.75   1 
2016-09-12 02:01:00 4661.25 4667.25 4657.25 4666.75  932 
2016-09-12 02:02:00 4666.75 4667.25 4663.25 4665.00  174 
2016-09-12 02:03:00 4665.00 4667.00 4665.00 4666.50   66 
Warning message: 
timezone of object (UTC) is different than current timezone(). 


> test_dt$hour1 = strftime(test_dt$index, format = "%H", tz = "America/New_York") 

> test_dt$hour2 = strftime(test_dt$index, format = "%H", tz = "UTC") 

> table(test_dt$hour1) 

14 16 22 
1 1 3 

> table(test_dt$hour2) 

02 18 20 
3 1 1 

Antwort

2

Das Verschieben von Zeitzonen ist ein wenig schwierig. Sie müssen zuerst zurücktreten und erkennen, dass die tatsächlich gespeicherte Zeit eine Anzahl (seit der Epoche 1. Januar 1970 Sekunden) repräsentativer absoluter Zeit ist. Dh, wie ich denselben Zeitpunkt („Epoche“) als Ortszeit in New York und Moskau vertreten:

R> format(as.POSIXct(0,origin="1970-01-01"), tz="UTC") 
[1] "1970-01-01" 
R> format(as.POSIXct(0,origin="1970-01-01"), tz="America/New_York") 
[1] "1969-12-31 19:00:00" 
R> format(as.POSIXct(0,origin="1970-01-01"), tz="Europe/Moscow") 
[1] "1970-01-01 03:00:00" 
R> 

Nun haben die Zeit, die Sie wahrscheinlich als Lokalzeit analysiert gespeichert wurde. Das heißt, sie enthalten einen Offset-Speicher als Zeitzone. Durch die Änderung, die Sie gerade zu der vorherigen Zeit relativ bewegen:

R> as.POSIXct("2016-09-10 16:38:00") # CDT as I am in Chicago 
[1] "2016-09-10 16:38:00 CDT" 
R> format(as.POSIXct("2016-09-10 16:38:00"), tz="America/New_York") 
[1] "2016-09-10 17:38:00" 
R> format(as.POSIXct("2016-09-10 16:38:00"), tz="America/Los_Angeles") 
[1] "2016-09-10 14:38:00" 
R> 

So verstehe ich Ihre Frage richtig, müssen Sie zwei Dinge tun: ‚rückgängig machen‘ die lokale Zeit, die Sie haben und dann auf die gewünschte Zeitzone bewegen.

Ich schrieb auch einen Helfer - im RcppCCTZ-Paket. Hier ist ein Beispiel für die toTz() Funktion:

R> example(toTz) 

toTzR> toTz(Sys.time(), "America/New_York", "Europe/London") 
[1] "2016-12-17 01:04:14.184086 CST" 

toTzR> # this redoes the 'Armstrong on the moon in NYC and Sydney' example 
toTzR> # note that the default print method will print the return object in _your local time_ 
toTzR> toTz(ISOdatetime(1969,7,20,22,56,0,tz="UTC"), "America/New_York", "Australia/Sydney", verbose=TRUE) 
1969-07-20 22:56:00 -0400 
1969-07-21 12:56:00 +1000 
[1] "1969-07-20 21:56:00 CDT" 

toTzR> # whereas explicitly formating for Sydney time does the right thing 
toTzR> format(toTz(ISOdatetime(1969,7,20,22,56,0,tz="UTC"), 
toTz+    "America/New_York", "Australia/Sydney", verbose=TRUE), 
toTz+  tz="Australia/Sydney") 
1969-07-20 22:56:00 -0400 
1969-07-21 12:56:00 +1000 
[1] "1969-07-21 12:56:00" 

Dies zeigt auch die zusätzliche Schwierigkeit, sicherzustellen, dass Sie auf die gewünschte Zeitzone drucken - nur das zweite Beispiel zeigt die richtige Sydney Zeit, wie wir ausdrücklich format() gesagt, es zu benutzen .

So zu Ihrem Beispiel zu kommen:

R> x <- xts(1:2, Sys.time() + 0:1) 
R> x 
          [,1] 
2016-12-16 20:13:43.29767 1 
2016-12-16 20:13:44.29767 2 
R> tzone(x) <- "America/New_York" 
R> x 
          [,1] 
2016-12-16 21:13:43.29767 1 
2016-12-16 21:13:44.29767 2 
Warning message: 
timezone of object (America/New_York) is different than current timezone(). 
R> index(x) <- index(x) - 60*60 # dirty method, last resort 
R> x 
          [,1] 
2016-12-16 20:13:43.29767 1 
2016-12-16 20:13:44.29767 2 
Warning message: 
timezone of object (America/New_York) is different than current timezone(). 
R> tzone(x) 
       TZ 
"America/New_York" 
R> 

So explizit Ich hat den numerischen Wert von 60 Minuten für die Tatsache zu berücksichtigen, dass ich die Zeit um eine Stunde verschoben (aus Chicago, meiner Ortszeit , nach New York).

2

Ihre Daten wurden wahrscheinlich als "America/New_York" -Zeit geladen, wenn Sie die Zeitzone wahrscheinlich als "UTC" angegeben haben sollten. (Sie können möglicherweise für FUN=POSIXct in der Zeitzone Argumente als Pass-Through-Parameter zu übergeben.)

Reproduktion Ihrer ursprüngliche Situation:

data <- " 2016-09-10 16:38:00 4665.75 4665.75 4665.75 4665.75   1 
2016-09-11 14:13:00 4665.75 4665.75 4665.75 4665.75   1 
2016-09-11 22:01:00 4661.25 4667.25 4657.25 4666.75  932 
2016-09-11 22:02:00 4666.75 4667.25 4663.25 4665.00  174 
2016-09-11 22:03:00 4665.00 4667.00 4665.00 4666.50   66" 

data = read.table(text = data, 
        col.names = c("date", "time", "Open" , "High", "Low", "Close", "Volume") 
       ) 
# assumes data is loaded in America/New_York time zone 
x_data <- xts(order.by = as.POSIXct(paste(data$date, data$time), tz = "America/New_York"), data[3:NCOL(data)]) 


x_data 
# Open High  Low Close Volume 
# 2016-09-10 16:38:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 14:13:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 22:01:00 4661.25 4667.25 4657.25 4666.75 932 
# 2016-09-11 22:02:00 4666.75 4667.25 4663.25 4665.00 174 
# 2016-09-11 22:03:00 4665.00 4667.00 4665.00 4666.50  66 

indexTZ(x_data) <- "UTC" 

# This reproduces your situation (problem): 
head(x_data) 
# Open High  Low Close Volume 
# 2016-09-10 20:38:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 18:13:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-12 02:01:00 4661.25 4667.25 4657.25 4666.75 932 
# 2016-09-12 02:02:00 4666.75 4667.25 4663.25 4665.00 174 
# 2016-09-12 02:03:00 4665.00 4667.00 4665.00 4666.50  66 


# This is what you probably wanted to do. Set the initial timezone to "UTC" when you loaded the data into R and created your `POSIXct` objects. 

x_data <- xts(order.by = as.POSIXct(paste(data$date, data$time), tz = "UTC"), data[3:NCOL(data)]) 
head(x_data) 
# Open High  Low Close Volume 
# 2016-09-10 16:38:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 14:13:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 22:01:00 4661.25 4667.25 4657.25 4666.75 932 
# 2016-09-11 22:02:00 4666.75 4667.25 4663.25 4665.00 174 
# 2016-09-11 22:03:00 4665.00 4667.00 4665.00 4666.50  66 
indexTZ(x_data) <- "America/New_York" 
# Now you get your desired outcome: 
head(x_data) 
# Open High  Low Close Volume 
# 2016-09-10 12:38:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 10:13:00 4665.75 4665.75 4665.75 4665.75  1 
# 2016-09-11 18:01:00 4661.25 4667.25 4657.25 4666.75 932 
# 2016-09-11 18:02:00 4666.75 4667.25 4663.25 4665.00 174 
# 2016-09-11 18:03:00 4665.00 4667.00 4665.00 4666.50  66 
0

Aha, ja, die Antwort ist den xts zu erstellen Objekt mit dem richtigen Zeitzone:

zB:

S = as.xts(test, tz = "UTC")