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.

pandas: ¿cómo agrupar por intervalos de tiempo de longitud variable?

Sé que es posible agrupar tus datos por intervalos de tiempo de la misma longitud utilizando la función resample. Pero, ¿cómo puedo agrupar por intervalos de tiempo de longitud personalizada (es decir, intervalos de tiempo irregulares)?

Aquí hay un ejemplo:
Digamos que tenemos un dataframe con valores de tiempo, como este:

rng = pd.date_range(start='2015-02-11', periods=7, freq='M')
df = pd.DataFrame({ 'Date': rng, 'Val': np.random.randn(len(rng)) })

Y tenemos los siguientes intervalos de tiempo:

2015-02-12 —–
2015-05-10

2015-05-10 —–
2015-08-20

2015-08-20 —–
2016-01-01

Es claro que las filas con índice 0, 1, 2 pertenecen al primer intervalo de tiempo, las filas con índice 3, 4, 5 pertenecen al segundo intervalo de tiempo y la fila 7 pertenece al último intervalo de tiempo.

Mi pregunta es: ¿cómo agrupo estas filas de acuerdo a esos intervalos de tiempo específicos, para poder realizar funciones de agregación (por ejemplo, media) en ellas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agrupar un dataframe por intervalos de tiempo irregulares, puedes hacer lo siguiente:

    1. Define los intervalos de tiempo como una lista de tuplas, donde cada tupla representa un tiempo de inicio y fin para un intervalo.
    2. Convierte tu columna Date en el índice del dataframe usando set_index.

    3. Utiliza un bucle para iterar a través de los intervalos y utiliza loc para cortar el dataframe por índice y agrupar por el intervalo actual.

    4. Aplica la función de agregación deseada (por ejemplo, mean) a los datos agrupados.

    5. Concatena los dataframes resultantes para obtener el resultado final.

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

    # Define the time intervals
    intervals = [(pd.Timestamp('2015-02-12'), pd.Timestamp('2015-05-10')),
                 (pd.Timestamp('2015-05-10'), pd.Timestamp('2015-08-20')),
                 (pd.Timestamp('2015-08-20'), pd.Timestamp('2016-01-01'))]
    
    # Set the index of the dataframe to the Date column
    df = df.set_index('Date')
    
    # Loop through the intervals and group by each interval
    dfs = []
    for interval in intervals:
        start, end = interval
        group = df.loc[start:end].groupby(pd.Grouper(freq='M'))
        result = group.mean()
        dfs.append(result)
    
    # Concatenate the resulting dataframes
    final_result = pd.concat(dfs)
    

    En este ejemplo, cortamos el dataframe usando loc y agrupamos por frecuencia mensual utilizando pd.Grouper. Puedes cambiar la frecuencia para ajustar tu nivel deseado de granularidad. Los dataframes resultantes se concatenan utilizando pd.concat para obtener el resultado final.

Comments are closed.