es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mapear cada fecha en intervalos de 15 minutos para cada día, puedes usar la función floor_date de lubridate 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 y lubridate:

    “`{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.

Comments are closed.