2017-02-10 10 views
1

В Windows следующий код подзапрос выдает неверный объект XTS, но корректно работает на моей машине UbuntuXTS время подвыборкой по дате DST Linux против Windows,

library(xts) 
theTimes <- seq(from=as.POSIXct('2016-03-10 12:00:00 CDT'), 
       to=as.POSIXct('2016-03-20 12:10:00 CDT'),by=60) 

ExampleData <- xts(rep(1,length(theTimes)),theTimes) 
CutExampleData <- ExampleData['T02:00/T16:00'] 
any(duplicated(index(CutExampleData))) ## Evaluates to TRUE on windows (incorrect) and FALSE on Ubuntu (correctly) 

SessionInfo на Linux PC:

R version 3.3.1 (2016-06-21) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 16.04.1 LTS 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RMySQL_0.10.9 DBI_0.5-1  Quandl_2.8.0 xts_0.9-7  zoo_1.7-13 

loaded via a namespace (and not attached): 
[1] httr_1.2.1  R6_2.1.3  tools_3.3.1  grid_3.3.1  jsonlite_1.0 lattice_0.20-33 

SessionInfo на компьютере с ОС Windows:

R version 3.3.2 (2016-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 10 x64 (build 14393) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] xts_0.9-7 zoo_1.7-13 

loaded via a namespace (and not attached): 
[1] grid_3.3.2  lattice_0.20-34 

Я думаю, что это связано с DST, поскольку t он индексирует последнюю дату переключения. Есть идеи?

+0

Пожалуйста, отредактируйте свой вопрос, чтобы включить вывод 'sessionInfo()' на обе машины. –

ответ

1

Я смог воспроизвести это на моей машине с Windows. Это выглядит как небезопасность в strptime и/или as.POSIXct.POSIXlt между версиями версии * nix и Windows R. Проблема проявляется, потому что ваше время начала 02:00:00, которого нет в 2016-03-13, потому что время идет от 01 : 59: 59.999 до 03:00:00 в часовом поясе Америки/Чиказа из-за летнего времени.

Обходной пункт должен установить время начала до незадолго до 02:00:00.

library(xts) 
theTimes <- seq(from=as.POSIXct('2016-03-12 00:00:00', tz="America/Chicago"), 
       to=as.POSIXct('2016-03-14 23:00:00', tz="America/Chicago"), by=60) 
ExampleData <- xts(rep(1,length(theTimes)),theTimes) 
# 01:59 instead of 02:00 to avoid DST issue 
CutExampleData <- ExampleData['T01:59/T16:00'] 
anyDuplicated(index(ExampleData)) 
anyDuplicated(index(CutExampleData)) # 0 (no duplicates) 

Также отметим, что «CDT» не является хорошим способом, чтобы указать часовой пояс в R. Временная зона аббревиатуры Трехбуквенные (кроме «GMT» и «UTC») может быть неоднозначным, так что лучше используйте спецификацию Страна/Город.

+0

Спасибо, Джош ... Похоже, это работает как работа. Любая идея, как трудно это исправить в базе R? Это своего рода глупая ошибка, о которой нужно всегда помнить. – BNL

+0

@BNL: Это не было бы тривиальным исправлением в базе R. R делает много работы, чтобы заставить datetime обрабатывать одно и то же в операционных системах, просто взгляните на любую часть из 1300 строк кода в [datetime.c ] (https://github.com/wch/r-source/blob/trunk/src/main/datetime.c). Я планирую продолжить исследование, проверить, было ли это сообщено, и, возможно, представить патч. У меня просто нет времени на это прямо сейчас. –

+0

Вы можете увидеть проблему, сравнивая «ISOdatetime (2016, 3, 13, 2, 0, 0,« »)' on * nix (2016-03-13 01:00:00 CST) и Windows (NA). –