Mam następujący problem: kolumna daty w danych, które otrzymuję, zawiera daty, które nie istnieją z powodu czasu letniego. (Na przykład 2015-03-29 02:00 nie istnieje w czasie środkowoeuropejskim, ponieważ zegar jest ustawiany bezpośrednio od 01:59 do 03:00, ponieważ DST zaczyna obowiązywać w tym dniu)Czy istnieje niezawodny sposób wykrywania obiektów POSIXlt reprezentujących czas, który nie istnieje z powodu DST?
Czy istnieje łatwy i niezawodny sposób ustalenia, czy data jest ważna w odniesieniu do czasu letniego?
Nie jest to trywialne ze względu na właściwości klas datetime.
# generating the invalid time as POSIXlt object
test <- strptime("2015-03-29 02:00", format="%Y-%m-%d %H:%M", tz="CET")
# the object seems to represent something at least partially reasonable, notice the missing timezone specification though
test
# [1] "2015-03-29 02:00:00"
# strangely enough this object is regarded as NA by is.na
is.na(test)
# [1] TRUE
# which is no surprise if you consider:
is.na.POSIXlt
# function (x)
# is.na(as.POSIXct(x))
as.POSIXct(test)
# [1] NA
# inspecting the interior of my POSIXlt object:
unlist(test)
# sec min hour mday mon year wday yday isdst zone gmtoff
# "0" "0" "2" "29" "2" "115" "0" "87" "-1" "" NA
więc najprostszym sposobem myślałem o to, by sprawdzić pole obiektu POSIXlt
isdst
, pomoc dla POSIXt
opisuje złożony sposób następujący:
isdst
Daylight Saving Time flag. Pozytywny, jeśli obowiązujący, zero, jeśli nie, ujemny, jeśli nie jest znany.
sprawdza pole isdst
Zapisz w tym sensie, że to pole jest tylko -1
jeżeli data jest nieważne z powodu zmiany czasu letniego lub może być -1
z innych powodów?
Informacje o wersji, platformy i lokalizacji
R.version
# _
# platform x86_64-w64-mingw32
# arch x86_64
# os mingw32
# system x86_64, mingw32
# status
# major 3
# minor 3.1
# year 2016
# month 06
# day 21
# svn rev 70800
# language R
# version.string R version 3.3.1 (2016-06-21)
# nickname Bug in Your Hair
Sys.getlocale()
# [1] "LC_COLLATE=German_Austria.1252;LC_CTYPE=German_Austria.1252;LC_MONETARY=German_Austria.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
Nie mogę odtworzyć Twojego przykładu. Kiedy wykonuję twój kod, nie otrzymuję 'is.na (test) FALSE', ale' TRUE' i otrzymuję CEST strefy czasowej podczas wykonywania 'testu'. Dwie możliwości: (1) Sys.getlocale(), (2) Jakiej wersji R używasz? –
'is.na (test)' powinno być 'TRUE' Używam' Sys.getlocale ("LC_TIME") '' "German_Austria.1252" 'ale przykład okazuje się taki sam, jeśli robię' Sys.setlocale ("LC_TIME", "german") 'jak również' Sys.setlocale ("LC_TIME", "english") 'ustawienie strefy czasowej w strptime powinno zająć się wyborem właściwej strefy czasowej. R-wersja to: R wersja 3.3.1 (2016-06-21) działająca: x86_64-w64-mingw32 (64-bitowy Windows 7) – snaut
Zgadnij, że jest zależny od systemu operacyjnego i nie mogę odtworzyć Twojego przykładu. Co się stanie, jeśli spróbujesz 'as.POSIXct (test)'? Jestem na Linuksie i zauważyłem, że obiekty "POSIXlt" czasami reprezentują nieprawidłowe czasy, podczas gdy 'POSIXct' nie. Jeśli spróbuję 'as.POSIXct (test)' otrzymam '2015-03-29 01:00:00 CET', tj. Datetime jest poprawiony. Być może możesz uzyskać swój test próbując 'identyczny (jak .OSIXlt (jak .OSIXct (test)), test)'. – nicola