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.

Comprueba si el valor está entre dos marcas de tiempo 24 veces (1 día en horas) en R.

El código se utilizará para comprobar si un intervalo de una hora está dentro de timestamp1 y timestamp2. Sin embargo, para cada id y sus correspondientes timestamps, esto debe hacerse 24 veces (de las 0:00:000 a las 23:00:000). Por lo tanto, cada id debería dar 24 resultados con VERDADERO o FALSO. El código no coincide con los intervalos dados (entre timestamp1 y timestamp2). ¿Cómo lo arreglo?

id <- c(1, 2 ,3 ,4 ,5)
timestamp1 <- structure(c(1618725826, 1618808778, 1618981628, 1619070713, 1619070218
), class = c("POSIXct", "POSIXt"), tzone = "")

timestamp2 <- structure(c(1618745800, 1618819480, 1618999145, 1619082202, 1619081591
), class = c("POSIXct", "POSIXt"), tzone = "")

matching_hours <- rep(F, 24)
names(matching_hours) <- 0:23

results <- lapply(id, function(id) {
  matching_hours[as.POSIXlt(timestamp1[id])$hour:as.POSIXlt(timestamp2[id])$hour] <- T
  matching_hours
})

results

Después lo hice en una tabla:

results <- lapply(id, function(id) {
  matching_hours[as.POSIXlt(timestamp1[id])$hour:as.POSIXlt(timestamp2[id])$hour] <- T
  data.table(t(matching_hours))
})

results <- rbindlist(results)

Pequeña nota al margen:
Los timestamps correspondientes significa que el id:1 corresponde con 1618725826 (timestamp1) y 1618745800 (timestamp2).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que solo está verificando un único intervalo entre el timestamp1 y timestamp2 para cada ID. Para verificar los 24 intervalos horarios entre los timestamps, el código debe ser modificado.

    Una forma de hacerlo es crear una secuencia de timestamps horarios entre timestamp1 y timestamp2 para cada ID usando la función seq.POSIXt. Luego, para cada ID, verificar si el timestamp horario se encuentra dentro del intervalo dado y almacenar los resultados en una matriz con 24 filas (una por cada hora) y un número de columnas igual al número de IDs.

    Aquí hay un ejemplo de código que hace esto:

    “`{r}
    library(data.table)

    id <- c(1, 2 ,3 ,4 ,5)
    timestamp1 <- structure(c(1618725826, 1618808778, 1618981628, 1619070713, 1619070218
    ), class = c(“POSIXct”, “POSIXt”), tzone = “”)

    timestamp2 <- structure(c(1618745800, 1618819480, 1618999145, 1619082202, 1619081591
    ), class = c(“POSIXct”, “POSIXt”), tzone = “”)

    crear matriz para almacenar los resultados

    results <- matrix(FALSE, nrow = 24, ncol = length(id))
    colnames(results) <- id

    for (i in 1:length(id)) {
    # crear secuencia de timestamps horarios entre timestamp1 y timestamp2
    hourly_timestamps <- seq.POSIXt(from = timestamp1[i], to = timestamp2[i], by = “hour”)

    # recorrer cada timestamp horario y verificar si se encuentra dentro del intervalo dado
    for (j in 1:length(hourly_timestamps)) {
    hour <- as.numeric(format(hourly_timestamps[j], "%H")) if (hour >= as.numeric(format(timestamp1[i], “%H”)) & hour <= as.numeric(format(timestamp2[i], “%H”))) {
    results[hour + 1, i] <- TRUE
    }
    }
    }

    convertir matriz de resultados a una data table

    results <- data.table(t(results))
    colnames(results) <- c(“hora”, id)

    results
    “`

    Esto debería devolver una tabla de datos con 24 filas (una por cada hora) y un número de columnas igual al número de IDs, donde cada valor es TRUE o FALSE, indicando si el intervalo horario correspondiente se encuentra dentro del timestamp1 y timestamp2 dados para cada ID.

Comments are closed.