Wydobywanie czasu z POSIXct

85

Jak wyodrębnić czas z serii obiektów POSIXct odrzucających część daty?

Na przykład mam:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", 
"POSIXt"))

który odpowiada tym datom:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" 
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" 
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

Teraz mam pewne wartości dla parametru mierzonego w tamtych czasach

val <- c(1.25343125e-05, 0.00022890575, 
         3.9269125e-05, 0.0002285681875, 
         4.26353125e-05, 5.982625e-05, 
         2.09575e-05, 0.0001516951251, 
         2.653125e-05, 0.0001021391875)

Chciałbym wykreślić val w funkcji pory dnia, niezależnie od konkretnego dnia, w którym mierzono val.

Czy jest jakaś konkretna funkcja, która pozwoliłaby mi to zrobić?

nico
źródło

Odpowiedzi:

117

Możesz użyć strftimedo konwersji dat na dowolny format znaków:

> t <- strftime(times, format="%H:%M:%S")
> t
 [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
 [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

Ale to niewiele pomaga, ponieważ chcesz wykreślić swoje dane. Jednym obejściem jest usunięcie elementu daty z godzin, a następnie dodanie tej samej daty do wszystkich godzin:

> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
 [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
 [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
 [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
 [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
 [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

Teraz możesz użyć tych datetimeobiektów na swoim wykresie:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

wprowadź opis obrazu tutaj


Aby uzyskać dodatkową pomoc, zobacz ?DateTimeClasses

Andrie
źródło
15

Były poprzednie odpowiedzi, które pokazały tę sztuczkę. W istocie:

  • musisz zachować POSIXcttypy, aby wykorzystać wszystkie istniejące funkcje kreślenia

  • jeśli chcesz `` nałożyć '' kilka dni na jedną działkę, podkreślając zmienność dzienną, najlepszą sztuczką jest też ...

  • nałożyć ten sam dzień (i miesiąc, a nawet rok, jeśli trzeba, co nie ma miejsca w tym przypadku)

co można zrobić, nadpisując składniki dnia miesiąca i miesiąca w POSIXltreprezentacji lub po prostu przesuwając „deltę” względem 0:00:00 między różnymi dniami.

Tak ze timesi valtak usłużnie dostarczone przez Ciebie:

## impose month and day based on first obs
ntimes <- as.POSIXlt(times)    # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday  # and $mon if it differs too
ntimes <- as.POSIXct(ntimes)   # convert back

par(mfrow=c(2,1))
plot(times,val)   # old times
plot(ntimes,val)  # new times

daje to w przeciwieństwie do oryginalnej i zmodyfikowanej skali czasu:

wprowadź opis obrazu tutaj

Dirk Eddelbuettel
źródło
10

data.tablePakiet posiada funkcję „ as.ITime”, który może zrobić to efektywnie wykorzystywać poniżej:

library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"
JegarP
źródło
4

Nie mogę znaleźć niczego, co dotyczyłoby dokładnie czasów zegarowych, więc użyłbym po prostu niektórych funkcji z pakietu: lubridate i pracowałem z sekundami od północy:

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

Następnie możesz przyjrzeć się niektórym kodom osi, aby dowiedzieć się, jak ładnie opisać osie.

Spacedman
źródło
Fajnie, będę musiał się przyjrzeć lubridate, wygląda na ciekawy pakiet.
nico
4

time_tStosunek ceny do północy czasu GMT jest zawsze podzielna przez 86400( 24 * 3600). Zatem wartość sekund od północy GMT wynosi time %% 86400.

Godzina w GMT to (time %% 86400) / 3600i można ją wykorzystać jako oś x wykresu:

plot((as.numeric(times) %% 86400)/3600, val)

wprowadź opis obrazu tutaj

Aby dostosować strefę czasową, dostosuj czas przed obliczeniem modułu, dodając liczbę sekund, o które Twoja strefa czasowa wyprzedza GMT. Na przykład środkowy czas letni w USA (CDT) jest 5 godzin za GMT. Aby wykreślić w funkcji czasu w CDT, używa się następującego wyrażenia:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
Matthew Lundberg
źródło
4

Dostarczono wiele rozwiązań, ale nie widziałem tego, który wykorzystuje pakiet chron:

hours = times(strftime(times, format="%T"))
plot(val~hours)

(przepraszam, nie jestem uprawniony do umieszczania zdjęcia, będziesz musiał sam to wykreślić)

Denis Chabot
źródło
1

Oto aktualizacja dla tych, którzy szukają tidyverse metody wyodrębniania hh: mm :: ss.sssss z obiektu POSIXct. Zwróć uwagę, że strefa czasowa nie jest uwzględniana w danych wyjściowych.

library(hms)
as_hms(times)
Susie Derkins
źródło