2016-12-16 4 views
0

Я хотел бы сказать r, что мои данные находятся в часовом поясе UTC, чтобы затем я мог переместить их на America/New_York. Но когда я использую indexTZ(), он меняет время.Как изменить часовые пояса в xts

Я хочу, чтобы 16:00 UTC час стал часом в 12:00 NY.

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 

ответ

2

Смещение временных интервалов немного сложно. Вам нужно сначала отступить и понять, что фактическое сохраненное время - это число (секунд с момента 1 января 1970 года), представляющее абсолютное время. Т.е. посмотреть, как я представляю тот же момент времени («эпоха») в качестве местного времени в Нью-Йорке и Москве:

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> 

Теперь время, которое вы сохранили, вероятно, были разобраны, как МестноеВремя. То есть они содержат хранилище смещения в качестве часового пояса. Изменяя, что вы просто двигаться по отношению к предыдущему времени:

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> 

Так я правильно понимаю ваш вопрос, вам нужно сделать две вещи: «отменить» местное время вы имеете, а затем перейти к нужному часовому поясу.

Я написал для этого помощника - в пакете RcppCCTZ. Вот один пример для функции toTz():

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" 

Это также показывает дополнительные трудности обеспечения того, чтобы при печати на нужных временные зоны - только второй пример показывает правильное время Сиднея, как мы явно сказали format() использовать его ,

Так, чтобы вернуться к вашему примеру:

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> 

Так я явно изменил числовое значения на 60 минут, чтобы объяснить тот факт, что я сдвинут время на час (из Чикаго, мое местное время , в Нью Йорк).

2

Ваши данные были загружены, вероятно, как «America/New_York», когда вы, вероятно, должны указать часовой пояс как «UTC». (Вы можете быть в состоянии пройти в часовом поясе аргументе как проходной параметр для FUN=POSIXct.)

воспроизводящего оригинала ситуация:

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

Ага, да, ответ заключается в создании XTS объект с правильным часовой пояс:

например:

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

Смежные вопросы