Пакет 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))