Извлекая время от POSIXct


как бы я извлек время из серии объектов POSIXct, отбрасывающих часть даты?

например, у меня есть:

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"))

что соответствует этим датам:

"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"

Теперь у меня есть некоторые значения для параметра, измеренного в те времена

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)

Я хотел бы построить val против времени суток, независимо от конкретного дня, когда был измерен val.

есть ли конкретная функция, которая позволит мне сделать это?

5 65

5 ответов:

можно использовать strftime для преобразования даты в любой символьный формат:

> 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"

но это не очень помогает, так как вы хотите построить свои данные. Одним из обходных путей является удаление элемента даты из вашего времени, а затем добавление идентичной даты ко всем вашим временам:

> 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"

теперь вы можете использовать эти datetime объекты на вашем участке:

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

enter image description here


для получения дополнительной справки см. ?DateTimeClasses

были предыдущие ответы, которые показали трюк. В сущности:

  • вы должны сохранить POSIXct типы, чтобы воспользоваться всеми существующими построение функции

  • если вы хотите "наложить" несколько дней на один сюжет, выделив внутридневную вариацию, лучший трюк тоже ...

  • наложить в тот же день (и месяц, и даже год, если это необходимо, что не так здесь)

что вы можете сделать, переопределив день месяца и месяц компоненты, когда в POSIXlt представление, или просто путем смещения "Дельта" относительно 0:00:00 между различными днями.

так и с times и val как услужливо предоставленной вами:

## 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

дает это противопоставление оригинальной и модифицированной шкал времени:

enter image description here

Я не могу найти ничего, что касается времени часов точно, поэтому я бы просто использовал некоторые функции из пакета: lubridate и работал с секундами-с-полуночи:

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

затем вы можете посмотреть на некоторые из кодов осей, чтобы выяснить, как красиво маркировать оси.

The time_t значение для полуночи GMT всегда делится на 86400 (24 * 3600). Значение секунд с полуночи по Гринвичу, таким образом, составляет time %% 86400.

час в GMT(time %% 86400) / 3600 и это может быть использовано в качестве оси x графика:

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

enter image description here

чтобы настроить часовой пояс, отрегулируйте время до принятия модуля, добавив количество секунд, что ваш часовой пояс опережает GMT. Например, центральное летнее время в США (CDT) составляет 5 часов за GMT. Для построения графика по времени в CDT используется следующее выражение:

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

многие решения были предоставлены, но я не видел этого, который использует пакет chron:

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

(извините, я не имею права размещать изображение, вам придется построить его самостоятельно)