【问题标题】:How to groupby for dataframe which has a datetimeindex only using hours如何对仅使用小时的日期时间索引的数据框进行分组
【发布时间】:2021-07-13 07:00:36
【问题描述】:

我有一个名为 new_dh 的网络请求数据框,看起来像(还有更多列

                    s-sitename     sc-win32-status
date_time                                                           
2006-11-01 00:00:00     W3SVC1          0.0
2006-11-01 00:00:00     W3SVC1          0.0
2006-11-01 01:00:00     W3SVC1          0.0
2006-11-01 01:00:00     W3SVC1          0.0
2006-11-01 02:00:00     W3SVC1          0.0
2007-02-28 02:00:00     W3SVC1          0.0
2007-02-28 10:00:00     W3SVC1          0.0
2007-02-28 23:00:00     W3SVC1          0.0
2007-02-28 23:00:00     W3SVC1          0.0
2007-02-28 23:00:00     W3SVC1          0.0

我想做的是按 datetimeindex 的小时数分组(请求的实际日期无关紧要,只是小时和所有时间已经四舍五入到不包括分钟),而是返回

                    count 
hour                                                           
0                    2
01                   2
02                   2
10                   1
23                   3

任何帮助将不胜感激。

我试过了

new_dh.groupby([new_dh.index.hour]).count()

但发现自己打印了许多相同值的列,而我只想要上面的版本

【问题讨论】:

    标签: python pandas datetime pandas-groupby


    【解决方案1】:

    如果在输出中需要DatetimeIndex,请使用DataFrame.resample

    new_dh.resample('H')['s-sitename'].count()
    

    DatetimeIndex.floor:

    new_dh.groupby(new_dh.index.floor('H'))['s-sitename'].count()
    

    您的解决方案的问题是,如果使用GroupBy.count,它会计算每个Hours 的所有列值,并排除缺失值,因此如果没有缺失值,则会获得具有相同值的多个列。可能的解决方案是在groupby 之后指定列:

    new_dh.groupby([new_dh.index.hour])['s-sitename'].count()
    

    因此更改了数据以查看排除缺失值的计数方式:

    print (new_dh)
                        s-sitename  sc-win32-status
    date_time                                      
    2006-11-01 00:00:00     W3SVC1              0.0
    2006-11-01 00:00:00     W3SVC1              0.0
    2006-11-01 01:00:00     W3SVC1              0.0
    2006-11-01 01:00:00     W3SVC1              0.0
    2006-11-01 02:00:00        NaN              0.0
    2007-02-28 02:00:00     W3SVC1              0.0
    2007-02-28 10:00:00     W3SVC1              0.0
    2007-02-28 23:00:00        NaN              0.0
    2007-02-28 23:00:00        NaN              0.0
    2007-02-28 23:00:00     W3SVC1              0.0
    
    
    df = new_dh.groupby([new_dh.index.hour]).count()
    
    print (df)
               s-sitename  sc-win32-status
    date_time                             
    0                   2                2
    1                   2                2
    2                   1                2
    10                  1                1
    23                  1                3
    

    所以如果指定了列:

    s = new_dh.groupby([new_dh.index.hour])['s-sitename'].count()
    print (s)
    date_time
    0     2
    1     2
    2     1
    10    1
    23    1
    Name: s-sitename, dtype: int64
    
    df = new_dh.groupby([new_dh.index.hour])['s-sitename'].count().to_frame()
    
    print (df)
               s-sitename
    date_time            
    0                   2
    1                   2
    2                   1
    10                  1
    23                  1
    

    如果还需要计数缺失值,则使用GroupBy.size:

    s = new_dh.groupby([new_dh.index.hour])['s-sitename'].size()
    print (s)
    date_time
    0     2
    1     2
    2     2
    10    1
    23    3
    Name: s-sitename, dtype: int64
    
    df = new_dh.groupby([new_dh.index.hour])['s-sitename'].size().to_frame()
    
    print (df)
               s-sitename
    date_time            
    0                   2
    1                   2
    2                   2
    10                  1
    23                  3
    

    【讨论】:

      【解决方案2】:

      您也可以使用groupby()assign() 方法来做到这一点:

      如果 'date_time' 列不是您的索引:

      result=df.assign(hour=df['date_time'].dt.hour).groupby('hour').agg(count=('s-sitename','count'))
      

      如果这是您的索引,则使用:

      result=df.groupby(df.index.hour)['s-sitename'].count().to_frame('count')
      result.index.name='hour'
      

      现在,如果您打印 result,那么您将获得所需的输出:

            count
      hour    
      0       1
      1       2
      2       2
      10      1
      23      3
      

      【讨论】:

        【解决方案3】:
        new_dh['hour'] = new_dh.index.map(lambda x: x.hour)
        new_dh.groupby('hour')['hour'].count()
        

        结果

        hour
        0     2
        1     2
        2     2
        10    1
        23    3
        Name: hour, dtype: int64
        

        如果你需要一个 DataFrame 作为结果:

        new_dh.groupby('hour')['hour'].count().rename('count').to_frame()
        

        在这种情况下,结果将是:

              count
        hour       
        0         2
        1         2
        2         2
        10        1
        23        3
        

        【讨论】:

          猜你喜欢
          • 2021-07-22
          • 2018-09-26
          • 2016-10-28
          • 2021-12-25
          • 1970-01-01
          • 2020-06-04
          • 2017-11-23
          • 2023-04-08
          • 2019-09-07
          相关资源
          最近更新 更多