2013-08-09 15 views
5

POSIXct'in nasıl çalıştığını veya bir şeyleri anlamamalıyım. Anladığım kadarıyla, bu dönem, 1970-01-01 GMT gibi standart bir zaman olmak üzere, dönemden bu yana geçen bir saniyedir.POSIXct, farklı saat dilimlerini kullanarak sayısal için

İki POSIXct zamanını, PST'de aynı mutlak süre olan bir EST'de bir tane alıyorum. Yine de, onları sayısal bir değere dönüştürdüğüm zaman, sonuç farklı… Birisi beni yanlış yaptığım şeye yönlendirebilir mi?

> 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 

burada Oturum bilgileri geçerli:

> 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

POSIXct ile oynamaya başlamadan önce sistem saat dilimini de belirlediğinizden emin olun. Örneğin, bunu 'Sys.setenv (TZ =' GMT ') 'kullanarak yapabilirsiniz. –

cevap

5

Saat dilimi isimleri istediğiniz kadar basit değildir. Arka plan için http://en.wikipedia.org/wiki/Tz_database ve kullanılan adların bir listesi için http://en.wikipedia.org/wiki/List_of_tz_database_time_zones'a bakın. Şimdiye kadar en iyi şey, tz = 'country/city' notasyonunu kullanmak ve yerel sistemin saat dilimini açıkça ayarlamaktır.

Yani, burada saat dilimini kodlamak için iki farklı yöntem kullanan bir komut dosyası: biz olduğu PST gibi olurdu POSIXct değerlerine bakarsak

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') 

, biz aslında var olduğunu görüyoruz iki farklı değer. kısaltması (tz ='PST') ile başlayarak, bu olsun:

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

Sence tz='PST' kullanılarak tanımlanır veri PST saat diliminde değil aslında, ama sistemin dilimini miras olduğunu görüyoruz.

biz ülke \ şehri kullanılarak tanımlanır verilere bu karşılaştırın:

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

Yani, biz açıkça ülke/şehir bilgileri ile kodlamak sadece verilerin doğru saat dilimi bilgileri yer alır.

+1

Bunu düşündüğümde, bu gerçekten tuhaf, çünkü ülke/şehir notasyonu kullanarak kodladığım şeyler şimdi doğru kısaltma oldu. POSIXct kafamda. –

+0

teşekkürler. bunu yaptı. aslen 'ABD/Doğu' 'ABD/Pasifik' kullandım, ancak EST/PST olarak yazdırmaya devam ettiğinden, bir noktada, yanlışlıkla çok fazla düşünmeden bunları değiştirdim. – vc273

3

tz="PST" bunu sisteminizde yapar düşündüğünden çok başka bir şey anlamına da ondan. Linux'taki olası tam isimler listesini /usr/share/zoneinfo/zone.tab içinde bulabilirsiniz. Benim linux dağıtımım için tz='America/Los_Angeles' çalışır.

?Sys.timezone yazarsanız daha fazla bilgi bulacaksınız.

+0

Ayrıca, EDT de belirsiz ve Kanada ve antipodal taklitçileri ile karışıklığı önlemek için 'EST5EDT' kullanmalısınız. –

İlgili konular