2011-10-05 18 views
11

Więc mam zestaw znaczników czasu takiego:Jak wykreślić tylko część czasu znacznika czasu z datą?

datetime<-c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00") 

chcę zrobić histogram tylko czasami. Co zrobiłem było podzielić kolumnę na przestrzeni dostać tylko razy, a następnie przekształcić z powrotem do obiektu POSIXct w celu qplot aby go wykreślić:

library(ggplot2, stringr)  
qplot(as.POSIXct(strptime((str_split_fixed(as.character(time), " ", 2)[,2]), "%H:%M:%S"))) 

Jednak wyjście as.POSIXct(strptime((str_split_fixed(as.character(datetime), " ", 2)[,2]), "%H:%M:%S")) jest

"2011-10-04 03:33:00 PDT" "2011-10-04 13:41:00 PDT" "2011-10-04 16:14:00 PDT" "2011-10-04 11:01:00 PDT" "2011-10-04 06:35:00 PDT" "2011-10-04 12:48:00 PDT" 

Spis działek, które chcę, ale wydaje mi się, że jest to zawikłane włamanie do mnie. Na pewno jest lepszy sposób na zrobienie tego? Mógłbym zamienić się w epokę czasu i fabułę, ale starałem się uniknąć konieczności zrobienia tego jako dodatkowego kroku.

Większe pytanie brzmi: "Jak kontrolować wyjście strptime?"

Odpowiedz

13

Co z tym podejściem?

require("ggplot2") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 

p <- qplot(dtTime) + xlab("Time slot") + scale_x_datetime(format = "%S:00") 
print(p) 

obliczenie, dtPOSIXct - trunc(dtPOSIXct, "days"), wyciągi czas klasy obiektów POSIXct w godzinach.

plot(p)

Dla ggplot2-0.9.1:

require("ggplot2") 
require("scales") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 

p <- qplot(dtTime) + xlab("Time slot") + 
    scale_x_datetime(labels = date_format("%S:00")) 
print(p) 

Dla ggplot2-0.9.3.1:

require("ggplot2") 
require("scales") 
dtstring <- c(
    "2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", 
    "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00" 
) 
dtPOSIXct <- as.POSIXct(dtstring) 

# extract time of 'date+time' (POSIXct) in hours as numeric 
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days")) 
class(dtTime) <- "POSIXct" 

p <- qplot(dtTime) + xlab("Time slot") + 
    scale_x_datetime(labels = date_format("%S:00")) 
print(p) 
+0

Dzięki, nie użyłem tak mocno obcięcia. Zawsze jest coś nowego do nauki! –

+1

Jestem zdezorientowany. Pracuję z podobną sytuacją, ale z ponad 2 milionami obserwacji. Kiedy używam ** format = "% S: 00" **, po prostu otrzymuję 00:00 dla wszystkich etykiet osi X.Próbowałem zmienić na **% H ** (S = sekundy i H = godziny dla tej funkcji), i to nie w porządku, albo: oś X zaczyna się o 17:00, liczy do 0:00, potem z powrotem do 18: 00 na końcu. (Etykiety są równomiernie rozmieszczone w ciągu 25 godzin.) –

+0

Hmm, zastanawiam się, czy to ma coś wspólnego z tym, że jestem w CDT, który jest 5 godzin za GMT, a czas POSIX zaczyna się od północy GMT, 1 stycznia. , 1970? Więc jeśli dodaję 5 * 60 * 60 do każdej wartości ... Nie, podrapam to. Jestem teraz w CST, czyli w GMT-6. –

4

Wystarczy skorzystać z podstawowych narzędzi, gdyż były one przeznaczone:

dtstring <- c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00") 
datetime <- as.POSIXct(dtstring) 
library(ggplot2) 
qplot(datetime) 

Format swoimi strunami jest domyślnym dla parsowania z as.POSIXct patrz ?strptime szczegóły lub jeśli masz coś innego niż tego formatu.

Jeśli chcesz konkretny format string od wartości daty i godziny, użyj format, jak w

format(datetime, "%d-%b") 
[1] "28-Sep" "24-Aug" "19-Sep" "18-Aug" "17-Sep" "15-Aug" 

znów zobaczyć ?strptime szczegóły. Jeśli naprawdę chcesz zmarnować wartości czasu, możesz użyć klasy Date. Należy pamiętać, że daty i godziny muszą mieć pełną strukturę, a każda inna reprezentacja jest po prostu sformatowanym tekstem.

qplot (jako. Data (datetime))

+0

Dzięki za odpowiedź, ale że działki te znaczniki czasu, a nie tylko część czasu. Właściwie to zamierzam zerwać daty i po prostu kreślić czasy, więc oś x obejmowałaby tylko 24 godziny. –

+0

Który argument słowa kluczowego odpowiada zmiennej "% d-% b" 'w wywołaniu' format'? Nie mogę znaleźć niczego, co byłoby odpowiednie w "formacie". – TMOTTM

+0

Zobacz? Strptime jest aliasowany do formatu.POSIXct – mdsumner

Powiązane problemy