Хотите объединить следующее в столбец даты и времени в R

У меня есть столбцы следующим образом

дата, столбец часов и минут

В первом столбце год месяц день вместе. Я хочу объединить столбцы 1, 4, 5 в формат DateTime в R. Пожалуйста, помогите мне. Я использовал as.date, но получаю ошибку.


person nani    schedule 04.10.2020    source источник
comment
Пожалуйста, предоставьте минимальный и воспроизводимый пример(ы) вместе с желаемым результатом. Используйте dput(), чтобы поделиться частью своих данных.   -  person ekoam    schedule 04.10.2020


Ответы (2)


Для полноты картины здесь используется другой подход, который использует 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))
person Uwe    schedule 04.10.2020
comment
Большое спасибо. Это сработало нормально, и спасибо, что поделились от создания нового фрейма данных до решения. - person nani; 13.10.2020

Следующая функция объединяет 3 столбца в один объект класса "POSIXct".

  1. Столбец, объединяющий год, месяц и день в формате yyyymmdd;
  2. Часовая колонка;
  3. Колонка минут.

Секунды обнуляются.

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)
person Rui Barradas    schedule 04.10.2020