2017-02-10 1 views
1

Sous Windows, le code subselect suivant produit un objet XTS incorrect, mais fonctionne correctement sur ma machine UbuntuXTS temps subselect sur la date DST Linux et 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 sur PC Linux:

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 sur Windows PC:

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 

Je pense que cela a à voir avec DST, car t L'index couvre la dernière date de basculement. Des idées?

+0

Veuillez modifier votre question pour inclure la sortie de 'sessionInfo()' sur les deux machines. –

Répondre

1

J'ai été en mesure de répliquer cela sur mon ordinateur Windows. Il ressemble à une infélicité dans strptime et/ou as.POSIXct.POSIXlt entre les versions * nix et Windows de R. Le problème se manifeste parce que votre heure de début est 02:00:00, qui n'existe pas le 2016-03-13 parce que les temps vont de 01 : 59: 59.999 à 03:00:00 dans le fuseau horaire de America/Chicago en raison de l'heure d'été.

Une solution consiste à définir votre heure de début sur juste avant 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) 

Notez également que « CDT » n'est pas une bonne façon de spécifier un fuseau horaire dans R. Les abréviations de fuseau horaire de trois lettres (à part « GMT » et « UTC ») peut être ambiguë, il est donc préférable de utilisez la spécification Pays/Ville.

+0

Merci Josh ... On dirait que cela fonctionne comme un travail. Une idée à quel point cela serait difficile à corriger dans R base? C'est une sorte de bêtise dont il faut toujours se souvenir. – BNL

+0

@BNL: Il ne s'agirait pas d'une correction triviale dans la base R. R fait beaucoup de travail pour que la gestion des datetime soit la même pour tous les systèmes d'exploitation, jetez simplement un coup d'œil sur les 1300 lignes de code de [datetime.c ] (https://github.com/wch/r-source/blob/trunk/src/main/datetime.c). Je prévois d'enquêter plus loin, vérifier si cela a déjà été signalé, et éventuellement soumettre un patch. Je n'ai juste pas le temps pour ça maintenant. –

+0

Vous pouvez voir le problème en comparant 'ISOdatetime (2016, 3, 13, 2, 0, 0," ")' sur * nix (2016-03-13 01:00:00 CST) et Windows (NA). –