У меня есть столбцы следующим образом
В первом столбце год месяц день вместе. Я хочу объединить столбцы 1, 4, 5 в формат DateTime в R. Пожалуйста, помогите мне. Я использовал as.date, но получаю ошибку.
У меня есть столбцы следующим образом
В первом столбце год месяц день вместе. Я хочу объединить столбцы 1, 4, 5 в формат DateTime в R. Пожалуйста, помогите мне. Я использовал as.date, но получаю ошибку.
Для полноты картины здесь используется другой подход, который использует sprintf()
для создания вектора даты и времени символов, который затем преобразуется с помощью as.POSIXct()
. with(df1, )
используется вместо ввода df1$dates
, df1$hour
, df1$min
.
with(df1, as.POSIXct(sprintf("%s%02i%02i", dates, hour, min), tz = "UTC", format = "%Y%m%d%H%M"))
[1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC" [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC" [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC" [10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC" [13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"
Также обратите внимание, что часовой пояс был установлен явно.
Другой альтернативой является использование пакета anytime
:
with(df1, anytime::utctime(sprintf("%s %02i%02i", dates, hour, min), tz = "UTC"))
[1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC" [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC" [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC" [10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC" [13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"
Обратите внимание, что спецификаторы формата не требуются. Только пробел должен быть вставлен между dates
и hour
.
И, наконец, можно использовать пакет lubridate
:
with(df1, lubridate::ymd_hm(sprintf("%s%02i%02i", dates, hour, min)))
[1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC" [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC" [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC" [10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC" [13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"
df1 <- data.frame(dates = rep("20010101", 14L),
times = NA, d = NA,
hour = rep(1:7, each = 2L),
min = rep(c(0L, 30L), 7L))
Следующая функция объединяет 3 столбца в один объект класса "POSIXct"
.
yyyymmdd
;Секунды обнуляются.
toDateTime <- function(x){
d <- as.Date(x[[1]], format = "%Y%m%d")
ISOdatetime(format(d, "%Y"), format(d, "%m"), format(d, "%d"),
hour = x[[2]], min = x[[3]], sec = 0L)
}
toDateTime(df1[c(1, 4, 5)])
# [1] "2001-01-01 01:00:00 WET" "2001-01-01 01:30:00 WET"
# [3] "2001-01-01 02:00:00 WET" "2001-01-01 02:30:00 WET"
# [5] "2001-01-01 03:00:00 WET" "2001-01-01 03:30:00 WET"
# [7] "2001-01-01 04:00:00 WET" "2001-01-01 04:30:00 WET"
# [9] "2001-01-01 05:00:00 WET" "2001-01-01 05:30:00 WET"
#[11] "2001-01-01 06:00:00 WET" "2001-01-01 06:30:00 WET"
#[13] "2001-01-01 07:00:00 WET" "2001-01-01 07:30:00 WET"
Тестовые данные
В следующих тестовых данных я установил столбцы и 3 в NA
, поскольку они не используются.
dates <- "20010101"
hour <- rep(1:7, each = 2)
min <- rep(c(0, 30), length.out = 14)
df1 <- data.frame(dates, times = NA, d = NA, hour, min)
dput()
, чтобы поделиться частью своих данных. - person ekoam   schedule 04.10.2020