Пакет R, строящий объекты времени из даты и часа (целое число)

У меня есть данные, представленные в форме даты, сообщающей день (формат "ГГГГ-ММ-ДД", например, "2015-03-11" и часы дня с номером (0-23).

Каков наиболее удобный способ получения временных объектов вида

"2015-03-11" and hour = 0 ->  "2015-03-11 00:00"
"2015-03-11" and hour = 1 ->  "2015-03-11 01:00"
"2015-03-11" and hour = 2 ->  "2015-03-11 02:00"

Я мог бы использовать функцию Date из Base или что-то из xts или timeDate. Должно быть легко, но я уверен, что кто-то там знает это быстро.

РЕДАКТИРОВАТЬ: данные представлены в 2 столбцах, один для даты и один числовой.

4 ответа

Решение

Предположим, у нас есть этот вход:

date <- c("2015-03-11", "2015-03-12")
hour <- 2:3

затем попробуйте один из них:

1) хрон

library(chron)
as.chron(date) + hour/24

давая:

[1] (03/11/15 02:00:00) (03/12/15 03:00:00)

2) POSIXct. Этот использует только базу R, без пакетов:

as.POSIXct(date) + 3600 * hour    

давая, в моей системе:

[1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT"

Если вы хотели получить результат в часовом поясе UTC, используйте:

as.POSIXct(date, tz = "UTC") + 3600 * hour  

3) смазать

library(lubridate)
ymd(date) + hours(hour)

давая:

[1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC"

Если вы хотите это в текущем часовом поясе, то:

ymd(date, tz = "") + hours(hour)

Обратите внимание, что решение chron предоставляет класс даты / времени, в котором не используются часовые пояса, что устраняет многие проблемы, которые могут быть вызваны часовыми поясами. Решения POSIXct и lubridate дают дату / время в определенном часовом поясе, как показано.

Вам не нужен внешний пакет для этого.
Если ваши данные в этом формате:

df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2)

просто примените следующую функцию:

format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M")

Вы могли бы попробовать

dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour),
                    format = "%Y-%m-%d %H")) 

а затем использовать format как и в других постах

Или же

 library(lubridate)
 ymd_h(with(df, sprintf('%s %02d', date, hour)))

Или немного более компактный

ymd_h(do.call(paste, df))

Попробуй это. Вы можете отформатировать его без секунд после использования format если хотите, хотя я думаю, что лучше оставить его в POSIXct класс, чтобы вы могли управлять им после слов (добавление удаления дней, секунд и т. д.)

as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H")
## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST"

Хотя, если вы настаиваете на своем точном выводе, вот решение с format

format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M")
## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00"

Данные

df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"), 
    V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-3L))
Другие вопросы по тегам