Сформировать дату и время из чисел

Вопросы по статистическому пакету R. Не обязательно гео.
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Сформировать дату и время из чисел

Сообщение VistaSV30 »

Добрый день!

В базе данных данных в строках записаны по 10 показателей времени, в следующем формате: дата события и отдельно 10 показателей времени. Далее в примере, приведены 3 записи и два показателя времени.
Надо показатели времени сделать в следующем виде "2019-08-24 12:44:00 UTC" и потом удалить ненужные колонки.

Код: Выделить всё

d <- rep(as.Date("2019-08-24"), 3)

h1 <- c(12, 14, 17) 
m1 <- c(44, 36, 52)

h2 <- c(13, 14, 18) 
m2 <- c(12, 56, 22)

df <- data.frame(d, h1, m1, h2, m2)

library(lubridate)
df$h1 <- df$d + hm(paste(df$h1, ":", df$m1))
df$h2 <- df$d + hm(paste(df$h2, ":", df$m2))

# удалить ненужные колонки
nm <- c("d", "m1", "m2")
sapply(df, df[, nm] <- NULL)
Если всё делать по отдельности для каждого показателя, то в принципе всё получается, но ведь наверняка же можно это сделать с помощью applay? Красивее и эффективнее!

Мой вариант такой, но пока не работает:

Код: Выделить всё

hn <- c("h1", "h2")
mn <- c("m1", "m2")

df[, hn] <- lapply(c(df$d, hn, mn), df$d + hm(paste(df[,hn], ":", df[,mn])))
И еще при удалении колонок, R колонки удаляет, но выдает ошибку.
Подскажите, как сделать?
Спасибо!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

- здесь apply-функции не нужны...
просто перепишите Ваш data.frame c нужными колонками:

Код: Выделить всё

df <- df[, c("h1", "h2")]
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

Ну. а если всё же захотите "поудалять", то:"

Код: Выделить всё

df$d <- df$m1 <- df$m2 <-  NULL 
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

... или так ещё можно удалить:

Код: Выделить всё

df[, c("d", "m1", "m2")] <- NULL
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Сформировать дату и время из чисел

Сообщение gamm »

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

Код: Выделить всё

tmp<-sprintf("%04d-%02d-%02d 12:00",prm.mtr[,"Year"],prm.mtr[,"Month"],prm.mtr[,"Day"])
T.GMT.date<-as.POSIXct(tmp, tz = "GMT", "%Y-%m-%d %H:%M")
prm.mtr[,"DoY"]<-as.integer(format(T.GMT.date,format="%j"))
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

... можно через ISOdatetime... Код в контексте Вашего примера:

Код: Выделить всё

# вектор лет
Y <-c(2019, 2019, 2019)
# вектор месяцев
M <- c(8, 8, 8)
# вектор чисел
D <- c(24, 24, 24)
# вектор часов (1-ый)
h1 <- c(12, 14, 17) 
# вектор минут (1-ый) 
m1 <- c(44, 36, 52)
# вектор часов (2-ой)
h2 <- c(13, 14, 18) 
# вектор минут (2-ой)
m2 <- c(12, 56, 22)
# вектор секунд
s <- rep(0, 3)
# 1-ый результирующий ISOdatetime-вектор (с именами аргументов функции)
dt1 <- ISOdatetime(year = Y, 
                   month = M, 
                   day = D, 
                   hour = h1, 
                   min = m1, 
                   sec = s, 
                   tz = "UTC")
# 2-ой результирующий ISOdatetime-вектор (можно и без имён аргументов функции)
dt2 <- ISOdatetime(Y, M, D, h2, m2, s, "UTC")
# data.frame результирующий
df <- data.frame(dt1, dt2, stringsAsFactors = FALSE)
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Сформировать дату и время из чисел

Сообщение VistaSV30 »

Спасибо за ответы!

Но, я извиняюсь - неправильно сформулировал вопрос. Должно быть так:
В базе данных (назовем ее - db) есть показатели времени:
h1,m1, h5,m5, h18,m18 ...
То есть названия показателей произвольные.
Дата для всех событий единичной строки db одна и та же - d

Я хотел создать два вектора: 1) часы; 2) минуты

Код: Выделить всё

h <- c("h1", "h5", "h18")
m <- c("m1", "m5", "m18")

И выполнить все вычисления одной строкой, примерно, так:
db[,h] <- sapply(db, FUN = d + hm(db[,h], db[,m]))

В результате в колонках h1, h5, h18 должны быть записаны показатели времени (дд-мм-гггг чч:мм).

Это возможно сделать в R?
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

... а db - то У Вас - она в реалии-то, что: ASCII-файл, Excel-файлы, dbf-файлы или файлы-таблицы под управлением какой-либо СУБД (MySQL, MariaDB, Oracle, PostGre.., SQLite и т.д. и т.п.)? Или у Вас уже есть конкретный импортированный файл из этой db-базы данных в R?
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Сформировать дату и время из чисел

Сообщение VistaSV30 »

База реальная и уже импортирована из dbf в R. То есть в данном случае db это data.frame. А - h1,m1, h5,m5, h18,m18 ..., d - это имена колонок
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

VistaSV30 писал(а): 16 июн 2020, 14:21База реальная и уже импортирована из dbf в R. То есть в данном случае db это data.frame
- так Вы конкретный фрагментик, если конечно можно из соображений "открытость-закрытость" Ваших данных, этого data.frame' а и выложите
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Сформировать дату и время из чисел

Сообщение VistaSV30 »

Это фрагмент с временами
https://yadi.sk/i/3tFaAa4CqzcCeg

Время сохранено так:
1) F61 - часы; F62 - минуты;
2) F63 - часы; F64 - минуты;
...
Всего 7 пар показателей

Вектора с названиями колонок, я уже сделал:

Код: Выделить всё

h <- c("F61", "F63", "F65", "F157", "F67", "F69", "F159")
m <- c("F62", "F64", "F66", "F158", "F68", "F70", "F160")
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

VistaSV30 писал(а): 16 июн 2020, 14:40Всего 7 пар показателей
- а на выходе Вам надо семь ISOdatetime-колонок ?
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Сформировать дату и время из чисел

Сообщение VistaSV30 »

nickleb писал(а): 16 июн 2020, 15:22- а на выходе Вам надо семь ISOdatetime-колонок ?
Да. Хотелось бы!
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
nickleb
Гуру
Сообщения: 968
Зарегистрирован: 22 май 2010, 20:20
Репутация: 154

Re: Сформировать дату и время из чисел

Сообщение nickleb »

VistaSV30 писал(а): 16 июн 2020, 16:03Да. Хотелось бы!

Код: Выделить всё

library(readxl)
library(lubridate)

xlsx_file <- "MoscowIndustrial1.xlsx"
df <- read_excel(xlsx_file)
colnames_df <- colnames(df)

h <- c("F61", "F63", "F65", "F157", "F67", "F69", "F159")
m <- c("F62", "F64", "F66", "F158", "F68", "F70", "F160")

dtN <- lapply(seq_along(h), 
              function(i) {
                hour_indx_colname <- which(colnames_df == h[i])
                minu_indx_colname <- which(colnames_df == m[i])
                dt_i <- ISOdatetime(year = year(df$DateStart), 
                                    month = month(df$DateStart), 
                                    day = day(df$DateStart), 
                                    hour = df[[hour_indx_colname]], 
                                    min = df[[minu_indx_colname]], 
                                    sec = 0, 
                                    tz = "UTC")
                return(dt_i)
              }
)

names(dtN) <- paste0("dt_", as.character(seq_along(h)))

df_new <- data.frame(dtN, stringsAsFactors = FALSE)
str(df_new)

rm(df, dtN)
Аватара пользователя
VistaSV30
Активный участник
Сообщения: 185
Зарегистрирован: 02 июл 2018, 15:05
Репутация: 7
Откуда: Балашиха

Re: Сформировать дату и время из чисел

Сообщение VistaSV30 »

Спасибо большое! Это то, что мне надо! :D
Природа не просто эксцентричнее, чем мы полагаем - она эксцентричнее, чем мы способны предположить. John Haldane
Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость