2013-08-09 16 views
5

Penso di non capire come funziona POSIXct o qualcosa del genere. Per quanto ho capito, sono passati pochi secondi dall'epoca, essendo l'epoca un tempo standard come 1970-01-01 GMT.POSIXct a numerico utilizzando diversi fusi orari

Prendo due POSIXct uno in EST uno in PST che sono lo stesso tempo assoluto. Tuttavia, quando li converto in un valore numerico, il risultato è diverso ... Qualcuno potrebbe indicarmi cosa sto facendo male?

> pst = as.POSIXct('2011-01-10 06:45:00', tz = 'PST') 
> est = as.POSIXct('2011-01-10 09:45:00', tz = 'EST') 
> as.numeric(pst) 
[1] 1294641900 
> as.numeric(est) 
[1] 1294670700 

qui è il mio informazioni di sessione:

> sessionInfo() 
R version 2.13.0 (2011-04-13) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

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

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

other attached packages: 
[1] RSQLite_0.9-4  snow_0.3-8   RMySQL_0.8-0  DBI_0.2-5   gtools_2.6.2  reshape2_1.1  ggplot2_0.8.9  proto_0.3-9.2  reshape_0.8.4  fTrading_2100.76 fBasics_\ 
2110.79 MASS_7.3-12 
[13] timeSeries_2130.92 timeDate_2131.00 plyr_1.7.1 

loaded via a namespace (and not attached): 
[1] stringr_0.4 tools_2.13.0 
+1

Assicurati di definire anche il fuso orario del tuo sistema prima di iniziare a giocare con POSIXct. Puoi farlo usando 'Sys.setenv (TZ = 'GMT')', per esempio. –

risposta

5

I nomi dei fusi orari non sono così semplici come vorresti. Vedere http://en.wikipedia.org/wiki/Tz_database per lo sfondo e http://en.wikipedia.org/wiki/List_of_tz_database_time_zones per un elenco dei nomi utilizzati. Di gran lunga la cosa migliore è usare la notazione tz = 'country/city' e impostare esplicitamente il fuso orario del sistema locale.

Quindi, ecco uno script che utilizza due metodi diversi per codificare il fuso orario:

Sys.setenv(TZ='GMT') 
pst.abr <- as.POSIXct('2011-01-10 06:45:00', tz = 'PST') 
est.abr <- as.POSIXct('2011-01-10 09:45:00', tz = 'EST') 
pst.country.city <- as.POSIXct('2011-01-10 06:45:00', tz = 'America/Los_Angeles') 
est.country.city <- as.POSIXct('2011-01-10 09:45:00', tz = 'America/New_York') 

Se guardiamo i valori POSIXct che ci sarebbe piaciuto essere stato PST, vediamo che in realtà hanno due valori diversi. Partendo con la sigla (tz ='PST'), si ottiene questo:

> pst.abr 
[1] "2011-01-10 06:45:00 UTC" 
> as.numeric(pst.abr) 
[1] 1294641900 

si vede che i dati che abbiamo definito utilizzando tz='PST' non è in realtà nel fuso orario PST, ma ha ereditato fuso orario del sistema.

Confrontare questo ai dati che abbiamo definito con il paese \ città:

> as.numeric(pst.country.city) 
[1] 1294670700 
> pst.country.city 
[1] "2011-01-10 06:45:00 PST" 

Quindi, solo i dati che abbiamo esplicitamente codificare con informazioni sul paese/città ha le informazioni fuso orario corretto.

+1

Quando ci penso, questo è davvero strano, perché le cose che ho codificato usando la notazione paese/città ora hanno l'abbreviazione corretta. POSIXct è la mia testa. –

+0

grazie. l'ha fatto originariamente usavo "US/Eastern" "US/Pacific", ma poiché continuava a stampare come EST/PST, ad un certo punto, inavvertitamente passai a quelli senza pensarci troppo. – vc273

3

È perché tz="PST" significa qualcosa di diverso da quello che si pensa che fa sul vostro sistema. Su Linux è probabile trovare l'elenco dei nomi completi disponibili in /usr/share/zoneinfo/zone.tab. Per la mia distro linux utilizzando tz='America/Los_Angeles' funziona.

Troverete ulteriori informazioni se si digita ?Sys.timezone.

+0

Inoltre, EDT è anche ambiguo e si dovrebbe usare "EST5EDT" per evitare confusione con gli imitatori canadesi e antipodal. –