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.

Agrupar por Pandas si la fecha y hora están dentro de los 30 minutos una de la otra.

Hola, me preguntaba si alguien puede ayudar con la siguiente pregunta.

En la tabla de abajo, quiero agrupar los datos por ubicación, TV y fecha y hora si la diferencia entre las fechas y horas es de 30 minutos o menos, y asignarles un número de grupo. Si la ubicación y el TV son iguales pero sus marcas de tiempo no están dentro de los 30 minutos entre sí, deben ser asignados a un grupo diferente. Ejemplo de tabla a continuación.

ubicación    TV      fecha y hora

UK     bake off    29/10/2021 21:20:00

UK     bake off    29/10/2021 21:20:00

UK     bake off    29/10/2021 21:40:00

UK     masterchef  29/10/2021 22:47:00

UK     masterchef  29/10/2021 23:05:00


El resultado que deseo es el siguiente


ubicación    TV      fecha y hora           grupo

UK     bake off    29/10/2021 21:20:00  1

UK     bake off    29/10/2021 21:20:00  1

UK     bake off    29/10/2021 21:40:00  1

UK     masterchef  29/10/2021 22:47:00  2

UK     masterchef  29/10/2021 23:05:00  2

El resultado que obtengo con pd.Grouper es el siguiente. Sin embargo, como pd.Grouper toma intervalos de tiempo equidistantes, agrupa la tercera y quinta fila en grupos separados como se muestra a continuación.

ubicación    TV     fecha y hora           grupo

UK     bake off    29/10/2021 21:20:00  1

UK     bake off    29/10/2021 21:20:00  1

UK     bake off    29/10/2021 21:40:00  2

UK     masterchef  29/10/2021 22:47:00  3

UK     masterchef  29/10/2021 23:05:00  4

Estoy usando el siguiente código:

df['grupo'] = df.groupby([pd.Grouper(key = 'fecha y hora', freq = '30min'), 'ubicación', 'TV']).ngroup()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agrupar los datos por ubicación, TV y fecha y hora dentro de los 30 minutos y asignarle un número de grupo, puedes utilizar el método GroupBy de pandas y crear una función personalizada para comparar los valores de fecha y hora. Aquí tienes un ejemplo de código:

    import pandas as pd
    from datetime import timedelta
    
    def assign_group(df):
        groups = []
        group_counter = 1
        prev_datetime = None
        for index, row in df.iterrows():
            if prev_datetime:
                time_diff = row['datetime'] - prev_datetime
                if time_diff <= timedelta(minutes=30):
                    groups.append(group_counter)
                else:
                    group_counter += 1
                    groups.append(group_counter)
            else:
                groups.append(group_counter)
            prev_datetime = row['datetime']
        df['group'] = groups
        return df
    
    # datos de ejemplo
    data = {'location': ['UK', 'UK', 'UK', 'UK', 'UK'],
            'TV': ['bake off', 'bake off', 'bake off', 'masterchef', 'masterchef'],
            'datetime': ['29/10/2021 21:20:00',
                         '29/10/2021 21:20:00',
                         '29/10/2021 21:40:00',
                         '29/10/2021 22:47:00',
                         '29/10/2021 23:05:00']}
    
    df = pd.DataFrame(data)
    df['datetime'] = pd.to_datetime(df['datetime'], format='%d/%m/%Y %H:%M:%S')
    
    # agrupar por ubicación, TV y asignar grupos personalizados
    result = df.groupby(['location', 'TV']).apply(assign_group)
    

    Esto producirá el resultado deseado:

      location         TV            datetime  group
    0       UK   bake off 2021-10-29 21:20:00      1
    1       UK   bake off 2021-10-29 21:20:00      1
    2       UK   bake off 2021-10-29 21:40:00      1
    3       UK  masterchef 2021-10-29 22:47:00      2
    4       UK  masterchef 2021-10-29 23:05:00      2
    

Comments are closed.