【问题标题】:How to use pandas Grouper to get sum of values within each hour如何使用 pandas Grouper 获取每小时内的值总和
【发布时间】:2020-12-18 22:36:19
【问题描述】:

我有下表:

         Hora_Retiro  count_uses
0         00:00:18           1
1         00:00:34           1
2         00:02:27           1
3         00:03:13           1
4         00:06:45           1
...            ...         ...
748700    23:58:47           1
748701    23:58:49           1
748702    23:59:11           1
748703    23:59:47           1
748704    23:59:56           1

我想对每小时内的所有值进行分组,这样我就可以看到每小时的使用总数(00:00:00 - 23:00:00)

我有以下代码:

hora_pico_aug= hora_pico.groupby(pd.Grouper(key="Hora_Retiro",freq='H')).count()

Hora_Retiro 列是 timedelta64[ns] 类型 这给出了以下输出:

                count_uses
Hora_Retiro            
00:00:02           2566
01:00:02            602
02:00:02            295
03:00:02              5
04:00:02             10
05:00:02           4002
06:00:02          16075
07:00:02          39410
08:00:02          76272
09:00:02          56721
10:00:02          36036
11:00:02          32011
12:00:02          33725
13:00:02          41032
14:00:02          50747
15:00:02          50338
16:00:02          42347
17:00:02          54674
18:00:02          76056
19:00:02          57958
20:00:02          34286
21:00:02          22509
22:00:02          13894
23:00:02           7134

但是,索引列从 00:00:02 开始,我希望它从 00:00:00 开始,然后每隔一小时开始。像这样的:

                count_uses
Hora_Retiro            
00:00:00           2565
01:00:00            603
02:00:00            295
03:00:00              5
04:00:00             10
05:00:00           4002
06:00:00          16075
07:00:00          39410
08:00:00          76272
09:00:00          56721
10:00:00          36036
11:00:00          32011
12:00:00          33725
13:00:00          41032
14:00:00          50747
15:00:00          50338
16:00:00          42347
17:00:00          54674
18:00:00          76056
19:00:00          57958
20:00:00          34286
21:00:00          22509
22:00:00          13894
23:00:00           7134

如何让它从 00:00:00 开始??

感谢您的帮助!

【问题讨论】:

  • 我无法使用您的数据样本重现此问题。尝试更新您的 pandas 版本。

标签: python pandas datetime pandas-groupby


【解决方案1】:

我假设您的 DataFrame 中的 Hora_Retiro 列是 Timedelta 类型。它不是 datetime,在这种情况下 还会打印日期部分。

确实,您的代码从分钟/秒开始创建组 取自第一行。

按“全时”分组:

  • 将此列中的每个元素四舍五入到小时
  • 然后分组(仅按此舍入值)。

代码如下:

hora_pico.groupby(hora_pico.Hora_Retiro.apply(
    lambda tt: tt.round('H'))).count_uses.count()

不过我建议你下定决心,你要数什么: count_uses 列中的行或值。 在第二种情况下,将 count 函数替换为 sum

【讨论】:

    【解决方案2】:

    您可以从Hora_Retiro 列创建hour 列。

    df['hour'] = df['Hora_Retiro'].dt.hour
    

    然后在hour的基础上再groupby

    gpby_df = df.groupby('hour')['count_uses'].sum().reset_index()
    gpby_df['hour'] = pd.to_datetime(gpby_df['hour'], format='%H').dt.time
    gpby_df.columns = ['Hora_Retiro', 'sum_count_uses']
    gpby_df
    

    给予

    Hora_Retiro sum_count_uses
    0   00:00:00    14
    1   09:00:00    1
    2   10:00:00    2
    3   20:00:00    2
    

    【讨论】:

    • 嗨!太感谢了!作为旁注,我不知道为什么,但 .dt.hour 由于某种原因不起作用。但是,我使用了 df["Hora_Retiro"].dt.components["hours"]。我认为这是因为数据类型。但其余的按预期工作!再次感谢!
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2015-09-25
    • 2016-11-23
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多