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.

¿Cómo represento y fusiono marcos de datos de series temporales con un *rango de fechas* en R?

Estoy trabajando en R y tengo datos de series de tiempo en los que el tiempo relevante es un rango de fechas — es decir, cada fila tiene tanto una fecha de inicio como una fecha de fin, y el registro especifica los resultados durante ese período. Me gustaría poder representar este objeto de manera apropiada en R y combinarlo con otras series de tiempo que tienen fechas específicas. En el caso de la fusión, me gustaría que cada registro de mi primera serie de tiempo (la que utiliza un rango de fechas) se empareje con una fecha que caiga dentro del rango, con criterios adecuados para desempatar en el caso de que haya dos o más fechas específicas que caigan dentro del rango. Aquí hay un ejemplo simple de lo que quiero que haga utilizando datos ficticios:

# Serie de tiempo con un rango de fechas
TIME.SERIES1
     Inicio        Fin  Valor
2018-01-01  2018-01-31   80.6 
2018-02-01  2018-02-28  140.5
2018-03-01  2018-03-31  122.1
2018-04-01  2018-04-30  108.5
2018-05-01  2018-05-31   96.0
2018-06-01  2018-06-30  103.3

# Serie de tiempo utilizando fechas específicas
TIME.SERIES2
      Fecha   Personal
2018-01-15     551
2018-02-14     606
2018-05-18     640
2018-06-02     635
2018-07-15     633

# Combinarlos utilizando una unión izquierda de TIME.SERIES1 y TIME.SERIES2
[algún comando de combinación]
     Inicio        Fin  Valor  Personal
2018-01-01  2018-01-31   80.6    551
2018-02-01  2018-02-28  140.5    606
2018-03-01  2018-03-31  122.1     NA
2018-04-01  2018-04-30  108.5     NA
2018-05-01  2018-05-31   96.0    640
2018-06-01  2018-06-30  103.3    635

Sé que se puede hacer este tipo de combinación fácilmente en SQL, pero no estoy seguro de cómo hacerlo en R. Anteriormente he utilizado el paquete xls para análisis de series de tiempo, pero no sé si puede lograr lo que quiero hacer. Este paquete parece permitirme especificar una sola fecha como índice, pero no un rango de fechas. Del mismo modo, parece permitirme combinar dos objetos de series de tiempo en una fecha única, pero no estoy seguro de cómo combinar en función de un rango de fechas (como se muestra arriba).


Preguntas: ¿Puede el sistema de series de tiempo en R manejar un objeto donde el índice de tiempo es un rango de fechas en lugar de una fecha específica (es decir, se puede tener un índice compuesto por una hora de inicio y una hora de fin)? ¿Cómo fusionamos datos con un rango de fechas en comparación con una fecha con fechas individuales?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, las funciones de series temporales en R pueden manejar un objeto donde el índice de tiempo es un rango de fechas. Una forma de representar esto en R es utilizando el paquete xts, que permite la creación de datos de series temporales con intervalos irregulares. En este caso, el objeto de series temporales se puede representar como una serie de valores indexados por un intervalo de tiempo, que consta de una fecha de inicio y una fecha de finalización.

    Aquí tienes un ejemplo de código para crear un objeto xts con un índice de rango de fechas:

    # Cargar los paquetes necesarios (asegúrate de instalarlos primero si aún no están instalados)
    library(xts)
    
    # Crear un marco de datos con fechas de inicio y fin
    df_fechas <- data.frame(Inicio = as.Date(c("2018-01-01", "2018-02-01", "2018-03-01", "2018-04-01", "2018-05-01", "2018-06-01")),
                            Fin = as.Date(c("2018-01-31", "2018-02-28", "2018-03-31", "2018-04-30", "2018-05-31", "2018-06-30")),
                            Valor = c(80.6, 140.5, 122.1, 108.5, 96.0, 103.3))
    
    # Convertir el marco de datos a un objeto xts con el rango de fechas como índice
    ts_fechas <- xts(df_fechas$Valor, order.by = as.interval(as.POSIXct(df_fechas[,1]), as.POSIXct(df_fechas[,2])))
    

    Para fusionar un objeto de series temporales con un rango de fechas en un objeto de series temporales con fechas individuales, podemos utilizar la función merge del paquete xts. El truco consiste en crear un nuevo objeto de series temporales con la misma fecha que el objeto de fechas individuales, pero con un rango que abarque solo esa fecha. Esto nos permitirá fusionar los dos objetos de series temporales utilizando las fechas de inicio y fin del objeto de rango de fechas como clave. Aquí tienes un ejemplo de código para fusionar los dos objetos de series temporales en el formato de nuestros datos simulados:

    # Crear una serie temporal con fechas individuales
    fechas <- as.Date(c("2018-01-15", "2018-02-14", "2018-05-18", "2018-06-02", "2018-07-15"))
    ts_fechas2 <- xts(c(551, 606, 640, 635, 633), order.by = fechas)
    
    # Crear un nuevo objeto de series temporales con intervalos de un día que abarque solo la fecha
    # del objeto de fechas individuales
    df_fechas2 <- data.frame(Fecha = as.POSIXct(fechas),
                             Fin = as.POSIXct(fechas) + 86400, # Añadir un día para obtener el final del intervalo
                             Personal = c(551, 606, 640, 635, 633))
    ts_fechas2_rango <- xts(df_fechas2$Personal, order.by = as.interval(df_fechas2$Fecha, df_fechas2$Fin))
    
    # Fusionar los dos objetos de series temporales en base a sus índices (utilizando las fechas de inicio y fin)
    ts_fusionadas <- merge(ts_fechas, ts_fechas2_rango)
    

    El objeto ts_fusionadas resultante debería tener el mismo formato que el dato fusionado en el ejemplo de datos simulados proporcionado en la pregunta.

Comments are closed.