Подтвердить что ты не робот

Извлечение времени из 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 vs время суток, независимо от того, какой день был измерен val.

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

4b9b3361

Ответ 1

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

> 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

Ответ 2

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

  • вы должны сохранить типы 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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Значение time_t для полуночи GMT всегда делится на 86400 (24 * 3600). Таким образом, значение секунд - с полуночи GMT 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)