2014-09-21 54 views
5

Moje pytanie pochodzi z this question. Pytanie zawierało następujący ciąg znaków.Konwersja Chr "00:00:00" na datę "00:00:00"

x <- "2007-02-01 00:00:00" 
y <- "02/01/2007 00:06:10" 

Jeśli spróbujesz przekonwertować ten ciąg na obiekt klasy daty, stanie się coś śmiesznego.

To jest próbka z odpowiedzi @ nrusell.

as.POSIXct(x,tz=Sys.timezone()) 
[1] "2007-02-01 EST" 

as.POSIXct(y,format="%m/%d/%Y %H:%M:%S",tz=Sys.timezone()) 
[1] "2007-02-01 00:06:10 EST" 

Jak widać, 00:00:00 znika z pierwszego przykładu. @Richard Scriven pozostawił następujący przykład w naszej dyskusji za pomocą lubridate.

dt <- as.POSIXct("2007-02-01 00:00:00") 
hour(dt) <- hour(dt)+1 
dt 
[1] "2007-02-01 01:00:00 EST" 
hour(dt) <- hour(dt)-1 
dt 
[1] "2007-02-01 EST" 

Ponownie 00:00:00 znika. Dlaczego R unika przechowania 00:00:00 w obiekcie klasy daty po konwersji? Jak możemy zachować 00:00:00?

+0

Co jeszcze bardziej Dziwne jest to, że jeśli zrobisz 'n <- now()', a następnie użyjesz 'hou r <-', 'minute <-' i' second <-', aby sprowadzić je wszystkie do zera, północ faktycznie pozostanie. Wackiness. Może to być "niedoskonałość" z przetwarzaniem daty i czasu w R. –

+2

@RichardScriven: Twierdzę, że to niedoskonałość w lubridate. Kwestia PO wcale nie jest problemem. Podobnie jest z argumentacją, że numer 1 nie drukuje zer po prawej stronie separatora dziesiętnego. –

+1

@JoshuaUlrich Ale północ to aktualna pora dnia, więc czy nie powinna być drukowana jako taka? –

Odpowiedz

5

To tylko print, który usuwa precyzję, jeśli część czasu jest północą. To jest wyjaśnione w pomocy technicznej, szczególnie w parametrze formatu:

Ciąg znaków. Wartością domyślną jest "% Y-% m-% d% H:% M:% S", jeśli dowolny komponent ma komponent czasu, który nie jest północą, a "% Y-% m-% d" inaczej

Jednym z pomysłów jest przedefiniowanie metody S3 print dla obiektu POSIXct:

print.POSIXct <- function(x,...)print(format(x,"%Y-%m-%d %H:%M:%S")) 

teraz na swoim przykładzie, czy drukować datę x (ze strony północy) można uzyskać:

x <- "2007-02-01 00:00:00" 
x <- as.POSIXct(x,tz=Sys.timezone()) 
x 
[1] "2007-02-01 00:00:00" 
+4

Kod wpływający na drukowanie jest w rzeczywistości w' format.POSIXlt', który wywołuje 'format.POSIXct', który' print.POSIXct' wywołuje - 'if (all (times [! is.na (razy)] == 0)); "% Y-% m-% d"; ' – thelatemail