2013-06-13 15 views
9

Próbowałem przeglądać ramkę danych, wyodrębniając wszystkie wiersze, w których składnik daty w kolumnie POSIXct był zgodny z pewną wartością. Natknąłem się na następujące, co mnie mylnie dezorientuje: as.Date(as.POSIXct(...)) nie zawsze zwraca poprawną datę.as.Date (jak.POSIXct()) podaje niewłaściwą datę?

> dt <- as.POSIXct('2012-08-06 09:35:23') 
[1] "2012-08-06 09:35:23 EST" 
> as.Date(dt) 
[1] "2012-08-05" 

Dlaczego data '2012-08- 09:35:23' równe „2012-08- ?

Podejrzewam, że to ma coś wspólnego z różnych stref czasowych używany, więc zauważyć, że strefa czasowa dt był „EST” Dałem to as.Date ::

> as.Date(as.POSIXct('2012-08-06 09:35:23'), tz='EST') 
[1] "2012-08-05" 

Ale to wciąż powraca 2012-08-05 .

Dlaczego tak jest? Jak mogę znaleźć wszystkie dane w mojej ramce danych, które były w dniu 2012-08-06? (jako, że subset(my.df, as.character(as.Date(datetime), tz='EST') == '2012-08-06') nie zwraca wiersza z datetime dt, nawet jeśli miało to miejsce w dniu 2012-08-06 ...)?

Dodane szczegóły: Linux 64bit (chociaż mogą się rozmnażać na 32bit), można uzyskać to zarówno R 3.0.1 & 3.0.0 i jestem obecnie AEST (Australian Eastern Standard Time)

+0

działa zgodnie z oczekiwaniami tutaj (R 3.0.0 w CEST stref czasowych) –

Odpowiedz

10

dokumentacji dla stref czasowych też jest dla mnie mylące. W niektórych przypadkach EST może nie być jednoznaczne i może faktycznie odnosić się do tz w Australii. Wypróbuj "EST5EDT" lub "America/New_York".

W tym przypadku może również odnosić się do różnic w sposobie, w jaki twój nie otwarty system obsługuje argument "tz", ponieważ otrzymuję "2012-08-06". (Jestem w PDT US tz w tej chwili, chociaż nie jestem pewien, że powinno mieć znaczenia.) Zmiana funkcji, która pobiera argument tz może wyjaśnić (lub nie):

> as.Date(as.POSIXct('2012-08-06 19:35:23', tz='EST')) 
[1] "2012-08-07" 
> as.Date(as.POSIXct('2012-08-06 17:35:23', tz='EST')) 
[1] "2012-08-06" 


> as.Date(as.POSIXct('2012-08-06 21:35:23'), tz='EST') 
[1] "2012-08-06" 
> as.Date(as.POSIXct('2012-08-06 22:35:23'), tz='EST') 
[1] "2012-08-07" 

Jeśli pominąć tz od as.POSIXct, a następnie przyjęto UTC.

Są to jednoznaczne nazwiskami Ozzie TZ jest (przynajmniej na moim Macu):

tzfile <- "/usr/share/zoneinfo/zone.tab" 
tzones <- read.delim(tzfile, row.names = NULL, header = FALSE, 
    col.names = c("country", "coords", "name", "comments"), 
    as.is = TRUE, fill = TRUE, comment.char = "#") 
grep("^Aus", tzones$name, value=TRUE) 
[1] "Australia/Lord_Howe" "Australia/Hobart"  
[3] "Australia/Currie"  "Australia/Melbourne" 
[5] "Australia/Sydney"  "Australia/Broken_Hill" 
[7] "Australia/Brisbane" "Australia/Lindeman" 
[9] "Australia/Adelaide" "Australia/Darwin"  
[11] "Australia/Perth"  "Australia/Eucla" 
+0

Jestem w Australii EST obecnie. Zakładam, że domyślny tz z 'as.POSIXct' był" EST ", jak gdy robię' as.POSIXct (...) 'Otrzymuję ciąg z dodanym" EST "(zobacz, co jest drukowane, kiedy definiuję' dt '). Linux, R 3.0.1. Spróbuję bawić się z tz w różnych miejscach. –

+0

'as.Date (dt, tz = 'EST')' zwraca '2012-08-05' dla mnie, ale 'as.Date (dt, tz = 'Australia/Brisbane')' zwraca '2012-08-06 ". Myślę, że jak wspomniałeś "EST" jest niejednoznaczne (byłoby miło z R powiedzieć mi tak ...) –

+0

Ahah. Zaryzykuję przypuszczenie, że więcej osób przyjmuje przeciwne założenie, że "EST" to wschodnia TZ USA. Być może możesz opublikować wyniki "AEST", które Wikipedia przynajmniej uważa za mniej niejednoznaczne: http://en.wikipedia.org/wiki/Time_in_Australia, chociaż masz zmienność wzdłuż osi NS nawet w swoim "EST". –

7

Fellow australijskiego Chiming tu (Brisbane lokalizacja, Win7 Enterprise 64 bit, R3.0.1):

można replikować problem:

> dt <- as.POSIXct('2012-08-06 09:35:23') 
> dt 
[1] "2012-08-06 09:35:23 EST" 
> as.Date(dt) 
[1] "2012-08-05" 

Od as.Date domyślnych do UTC (GMT) wymienionych w ?as.Date:

## S3 method for class 'POSIXct' 
as.Date(x, tz = "UTC", ...) 

zmuszając reprezentacji POSIXct UTC następnie działa zgodnie z oczekiwaniami :

> dt <- as.POSIXct('2012-08-06 09:35:23',tz="UTC") 
> as.Date(dt) 
[1] "2012-08-06" 

Alternatywnie, dopasowując je zarówno do mojego lokalnego tz działa zbyt dobrze:

> dt <- as.POSIXct('2012-08-06 09:35:23',tz="Australia/Brisbane") 
> as.Date(dt,tz="Australia/Brisbane") 
[1] "2012-08-06" 

Edit: Wieloznaczność ze specyfikacją EST wydaje się być problemem dla mnie:

Domyślnie wykorzystanie as.POSIXct

> dt.def <- as.POSIXct("2012-01-01 22:00:00") 
> dt.def 
[1] "2012-01-01 22:00:00 EST" 
> as.numeric(dt.def) 
[1] 1325419200 
> 

Niejednoznaczny EST - powinien być taki sam jak domyślny

> dt.est <- as.POSIXct("2012-01-01 22:00:00",tz="EST") 
> dt.est 
[1] "2012-01-01 22:00:00 EST" 
> as.numeric(dt.est) 
[1] 1325473200 
> 

Jednoznaczne Brisbane, Australia stref czasowych

> dt.bris <- as.POSIXct("2012-01-01 22:00:00",tz="Australia/Brisbane") 
> dt.bris 
[1] "2012-01-01 22:00:00 EST" 
> as.numeric(dt.bris) 
[1] 1325419200 
> 

Różnice

> dt.est - dt.def 
Time difference of 15 hours 
> dt.est - dt.bris 
Time difference of 15 hours 
> dt.bris - dt.def 
Time difference of 0 secs 
+0

'as.Date (dt, tz = 'EST')' zwraca '2012-08-05' dla mnie, ale 'as.Date (dt, tz = 'Australia/Brisbane')' zwraca '2012-08-06 ". Domyślam się, że @DWin wspomniał, że "EST" jest niejednoznaczne (byłoby miło z R powiedzieć mi tak ...) –

+0

Żadne z was nie wspomniało o twoim systemie operacyjnym i jest repozytorium bazy danych TZ. Publikuję załącznik do mojej odpowiedzi. –

Powiązane problemy