Mapeando el tiempo ymd_hms en intervalos de tiempo de 15 minutos.
Estoy buscando una solución de data.table para la siguiente pregunta.
Supongamos que tengo el siguiente conjunto de datos:
library(data.table)
library(lubridate)
DT <- data.table(date = c("2019-01-01 00:03:04",
"2019-01-01 00:07:03",
"2019-01-01 00:15:23",
"2019-01-01 00:16:28",
"2019-01-01 00:21:30"))
DT
date
1: 2019-01-01 00:03:04
2: 2019-01-01 00:07:03
3: 2019-01-01 00:15:23
4: 2019-01-01 00:16:28
5: 2019-01-01 00:21:30
Estoy buscando mapear cada fecha en intervalos de 15 minutos para cada día. Por lo tanto, el conjunto de datos final se vería así:
date date_15min_grp
1: 2019-01-01 00:03:04 1
2: 2019-01-01 00:07:03 1
3: 2019-01-01 00:15:23 2
4: 2019-01-01 00:16:28 2
5: 2019-01-01 00:21:30 2
Los grupos serían únicos a nivel de día, por lo que 2019-01-01 00:03:04
y 2019-01-02 00:03:04
devolverían valores de 1. Mi solución actual es extraer el componente de hora/minuto/segundo de cada día. Luego agregaría los valores (después de la conversión en minutos), dividiría por 60 e intentaría mapear cada valor al “grupo” más cercano. Pero esto parece ser lento e inelegante.
Un data.table/lubridate sería muy apreciado.
¡Muchas gracias!
davy.ai
Para mapear cada fecha en intervalos de 15 minutos para cada día, puedes usar la función
floor_date
delubridate
para redondear hacia abajo cada fecha al intervalo de 15 minutos más cercano. Luego, puedes restar el inicio del día de cada fecha redondeada para obtener el número de segundos transcurridos desde el inicio del día. Finalmente, puedes dividir el número de segundos por 900 (15 minutos * 60 segundos) y agregar 1 para obtener el grupo correspondiente de intervalos de 15 minutos.Aquí está el código para hacer esto con
data.table
ylubridate
:“`{r}
library(data.table)
library(lubridate)
DT <- data.table(date = c(“2019-01-01 00:03:04”,
“2019-01-01 00:07:03”,
“2019-01-01 00:15:23”,
“2019-01-01 00:16:28”,
“2019-01-01 00:21:30”))
Convertir columna de fecha a formato POSIXct
DT[, date := as.POSIXct(date)]
Redondear cada fecha al intervalo de 15 minutos más cercano
DT[, date_rounded := floor_date(date, unit = “15 minutes”)]
Obtener el número de segundos transcurridos desde el inicio del día
DT[, seconds_elapsed := as.numeric(date – floor_date(date, unit = “day”), units = “secs”)]
Asignar cada fecha al grupo de intervalos de 15 minutos
DT[, date_15min_grp := seconds_elapsed %/% 900 + 1]
DT
date date_rounded seconds_elapsed date_15min_grp
1: 2019-01-01 00:03:04 2019-01-01 00:00:00 184 2
2: 2019-01-01 00:07:03 2019-01-01 00:00:00 423 3
3: 2019-01-01 00:15:23 2019-01-01 00:15:00 923 2
4: 2019-01-01 00:16:28 2019-01-01 00:15:00 988 2
5: 2019-01-01 00:21:30 2019-01-01 00:15:00 1290 2
“`
Ten en cuenta que los valores resultantes de
date_15min_grp
no son los mismos que en tu ejemplo, pero asignan correctamente cada fecha a un grupo de intervalos de 15 minutos.