按小时和天分组的Pandas

z9smfwbn  于 2024-01-04  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个包含一个月时间戳的文本的框架,类似于这样:

timestamp              text
2023-01-01 00:00:00    ABC
2023-01-01 00:00:01    DEF
2023-01-01 00:00:01    GHI
...

字符串
我想计算一周中每小时和每一天的文本数量,所以最后有168(24*7)个数字。
例如,如果2023-01-01,这是星期天,上午10点和上午11点之间有10个文本,下一个星期天(2023-01-08)总是上午10点和上午11点之间有15个文本,等等。在结束时,所有星期天上午10点和上午11点之间的所有文本的数量是:10+15+...
我想在一周的每一天和每一小时都这样做。
如果原始的数组是df,我开始按小时分组:

hours_df = df.groupby(pd.Grouper(key="timestamp", freq="h")).size().reset_index(name="count_hours")


然后我添加了day_of_week

hours_df["day_of_week"] = hours_df["timestamp"].dt.dayofweek


但是如果我现在用day_of_week这样分组:

day_df = hours_df.groupby("day_of_week").size().reset_index(name="count_days")


我将丢失有关小时的信息,结果是一个有7个条目的数组,即天数。
我怎样才能把小时的分组和日的分组合并结合起来呢?

u91tlkcl

u91tlkcl1#

您可以直接按星期和小时分组:

df.groupby([df['timestamp'].dt.dayofweek.rename('dow'),
            df['timestamp'].dt.hour.rename('hour')
           ]).size()

字符串
或者使用concatvalue_counts

pd.concat([df['timestamp'].dt.dayofweek.rename('dow'),
           df['timestamp'].dt.hour.rename('hour')], axis=1
         ).value_counts()


输出量:

dow  hour
6    0       3
dtype: int64

  • 注:对于足够长的输入,您应该有所有组合,如果没有,您可以始终reindex

或者,对于矩形输出,使用crosstab

pd.crosstab(df['timestamp'].dt.dayofweek.rename('dow'),
            df['timestamp'].dt.hour.rename('hour'))

# or for all values:
out = (pd.crosstab(df['timestamp'].dt.dayofweek.rename('dow'),
                   df['timestamp'].dt.hour.rename('hour'))
         .reindex(index=range(1, 7), columns=range(24), fill_value=0)
      )


输出量:

hour  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23
dow                                                                                                 
1      0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
2      0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
3      0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
4      0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
5      0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
6      3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

相关问题