Извлечение времени из POSIXct - PullRequest
71 голосов
/ 23 марта 2012

Как мне извлечь время из серии объектов 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.

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

Ответы [ 6 ]

95 голосов
/ 23 марта 2012

Вы можете использовать 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

14 голосов
/ 23 марта 2012

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

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

  • , если вы хотите «наложить»Несколько дней на одном графике, подчеркивая внутрисуточное отклонение, лучший трюк тоже ...

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

, что можно сделать, переопределив компоненты дня и месяца в представлении POSIXlt или просто сместив 'delta' относительно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

7 голосов
/ 20 ноября 2018

Пакет data.table имеет функцию 'as.ITime', которая может эффективно использовать это ниже:

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"
4 голосов
/ 06 мая 2015

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

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

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

3 голосов
/ 27 мая 2014

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

Час по Гринвичу составляет (time %% 86400) / 3600, и его можно использовать в качестве оси X графика:

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

enter image description here

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

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
3 голосов
/ 23 марта 2012

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

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

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

...