Витяг часу з POSIXct


85

Як витягнути час із серії об’єктів 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.

Чи існує якась особлива функція, яка дозволила б мені це зробити?

Відповіді:


117

Ви можете використовувати 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")

введіть тут опис зображення


Для отримання додаткової допомоги див ?DateTimeClasses


16

Раніше були відповіді, які показали фокус. По суті:

  • Ви повинні зберегти 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

дає це протиставлення оригінальному та зміненому шкалам часу:

введіть тут опис зображення


10

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

Я не можу знайти нічого, що стосується точно годинникового часу, тому я б просто використовував деякі функції з пакета: lubridate і працював із секундами з півночі:

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

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


Приємно, доведеться подивитися lubridate, здається цікавим пакетом.
Ніко

4

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

Годинник у GMT є, (time %% 86400) / 3600і це може бути використано як вісь x графіку:

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

введіть тут опис зображення

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

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

4

Надано багато рішень, але я не бачив цього, який використовує пакет chron:

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

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


1

Ось оновлення для тих, хто шукає метод tidyverse для вилучення hh: mm :: ss.sssss з об’єкта POSIXct. Зверніть увагу, що часовий пояс не входить у вихідні дані.

library(hms)
as_hms(times)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.