2017-02-10 3 views
1

unter Windows der folgenden subselect Code ein falsches XTS-Objekt erzeugt, funktioniert aber richtig auf meinem Ubuntu-RechnerXTS Zeit subselect über DST Datum Linux vs 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) 

Session auf 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 auf 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 

Ich denke, das hat mit DST zu tun, seit t Der Index umfasst das letzte Umstellungsdatum. Irgendwelche Ideen?

+0

Bitte bearbeiten Sie Ihre Frage, um die Ausgabe von 'sessionInfo()' auf beiden Rechnern einzubinden. –

Antwort

1

Ich konnte dies auf meiner Windows-Maschine replizieren. Es sieht aus wie eine Hilflosigkeit in strptime und/oder as.POSIXct.POSIXlt zwischen * Nix und Windows-Versionen von R. Das Problem manifestiert sich, weil Ihre Startzeit 02:00:00 ist, die nicht am 2016-03-13 existiert, da die Zeiten von 01 gehen : 59: 59.999 bis 03:00:00 in der Zeitzone Amerika/Chicago aufgrund der Sommerzeit.

Eine Umgehungslösung besteht darin, Ihre Startzeit auf kurz vor 02:00:00 einzustellen.

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) 

Beachten Sie auch, dass „CDT“ ist kein guter Weg, um eine Zeitzone in R. angeben Die Drei-Buchstaben-Zeitzone Abkürzungen (abgesehen von „GMT“ und „UTC“) mehrdeutig sein können, so ist es besser zu Verwenden Sie die Land/Stadt-Spezifikation.

+0

Dank Josh ... Sieht so aus, als ob dies als eine Arbeit funktioniert. Irgendeine Idee, wie schwierig das wäre, in R-Basis zu reparieren? Es ist irgendwie ein dummer Fehler, an den man sich immer erinnern muss. – BNL

+0

@BNL: Es wäre kein trivialer Fix in der Basis R. R macht viel Arbeit, um die Datetime-Behandlung für alle Betriebssysteme gleich zu machen. Sehen Sie sich nur eine Handvoll der ~ 1300 Codezeilen in [datetime.c an ] (https://github.com/wch/r-source/blob/trunk/src/main/datetime.c). Ich plane, weiter zu untersuchen, zu überprüfen, ob dies bereits gemeldet wurde, und möglicherweise einen Patch zu senden. Ich habe gerade keine Zeit dafür. –

+0

Sie können das Problem sehen, indem Sie 'ISOdatetime (2016, 3, 13, 2, 0, 0," ")' on * nix (2016-03-13 01:00:00 CST) und Windows (NA) vergleichen. –