Python: recuento de tiempo de horas de variables categóricas

Oct 04 2020

Tengo un marco de datos de pandas con columnas ['DateTime', 'Variable']y estoy tratando de obtener un recuento continuo en la última hora para cada uno Variable. Thinking pivot podría usarse de alguna manera.

Data de muestra

DateTime             Variable
8/24/19 3:30PM       A
8/24/19 3:32PM       A
8/24/19 3:36PM       B
8/24/19 3:50PM       C
8/25/19 2:50PM       A

Rendimiento esperado

DateTime          A    B    C
8/24/19 3:30PM    1    0    0 
8/24/19 3:32PM    2    0    0  
8/24/19 3:36PM    2    1    0 
8/24/19 3:50PM    2    1    1
8/25/19 2:50PM    1    0    0

Se pueden agregar o eliminar nuevas variables, por lo que me gustaría tener una solución que sea dinámica.

Respuestas

RichieV Oct 04 2020 at 02:47

Se podría, de hecho, comenzar con pivot, o hacerlo a mano con groupby.unstack.

Entonces está buscando df.rollingcrear ventanas móviles que se puedan agregar con muchas funciones. Para que las ventanas se creen con un timedelta (1 hora en este caso), debe asegurarse de que el índice sea de datetimetipo.

df['DateTime'] = pd.to_datetime(df['DateTime'])

out = (
    df
    .groupby(['DateTime', 'Variable']) # set the columns as index
    .size() # aggregate by row count
    .unstack(fill_value=0) # move 'Variable' index level to columns
    .sort_index()
)

out = out.rolling('1h').sum()

Salida

Variable               A    B    C
DateTime
2019-08-24 15:30:00  1.0  0.0  0.0
2019-08-24 15:32:00  2.0  0.0  0.0
2019-08-24 15:36:00  2.0  1.0  0.0
2019-08-24 15:50:00  2.0  1.0  1.0
2019-08-25 14:50:00  1.0  0.0  0.0
PrakritiShaurya Oct 04 2020 at 02:01

Considerando df es su conjunto de datos: new_df = df [df ['Variable'] == 'A']. Resample ('H'). Count ()

Puede crear un nuevo marco de datos de la siguiente manera: final_df = pd.DataFrame ({'DateTime': new_df.index, 'A': new_df.values})

De manera similar, tome el recuento para cada categoría de la columna Variable e intente concaminarlo con el bucle final_df.

No lo he probado, pero espero que funcione.