Eu tenho um dataframe cobrindo um mês de texto com carimbo de data/hora, mais ou menos assim:
timestamp text
2023-01-01 00:00:00 ABC
2023-01-01 00:00:01 DEF
2023-01-01 00:00:01 GHI
...
Gostaria de contar a quantidade de texto para cada hora e para cada dia da semana, para ter no final 168 (24*7) números.
Por exemplo se no dia 01-01-2023, que é domingo, entre as 10h e as 11h há 10 textos, no domingo seguinte (08-01-2023) sempre entre as 10h e as 11h há 15 textos, e assim sucessivamente. No final o número de todos os textos para todos os domingos entre as 10h e as 11h é: 10+15+...
Quero fazer isso para cada hora e para cada dia da semana.
Se o dataframe original for df
, comecei a agrupar por horas:
hours_df = df.groupby(pd.Grouper(key="timestamp", freq="h")).size().reset_index(name="count_hours")
então adicionei o day_of_week
:
hours_df["day_of_week"] = hours_df["timestamp"].dt.dayofweek
mas se eu agrupar agora desta day_of_week
forma:
day_df = hours_df.groupby("day_of_week").size().reset_index(name="count_days")
Vou perder a informação das horas e o resultado é um dataframe com 7 entradas, ou seja, os dias.
Como posso combinar o agrupamento das horas com o dos dias?
Você pode agrupar diretamente por dia da semana e hora:
Ou usando
concat
evalue_counts
:Saída:
Nota. para uma entrada longa o suficiente, você deve ter todas as combinações; caso contrário, sempre poderá
reindex
.Alternativamente, para uma saída retangular, use
crosstab
:Saída: