Python 如何为仅使用小时的datetimeindex的dataframe设置groupby

Python 如何为仅使用小时的datetimeindex的dataframe设置groupby,python,pandas,datetime,pandas-groupby,Python,Pandas,Datetime,Pandas Groupby,我有一个名为new_dh of web request的数据框架,看起来像(有更多的列) s-sitename sc-win32-status date_time 2006-11-01 00:00:00 W3SVC1 0.0 2006-11-01 00:00:00 W3SVC1 0

我有一个名为new_dh of web request的数据框架,看起来像(有更多的列)

                    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()

但是,我发现自己打印了许多相同值的列,而我只希望在输出中使用上述版本

(如果需要
DatetimeIndex
):

或:

您的解决方案的问题是,如果使用它计算每个
小时的所有列值,并排除缺少的值,那么如果没有缺少的值,将获得具有相同值的多个列。可能的解决方案是在
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
如果需要计数也缺少值,则使用:


如果需要在输出中使用
DatetimeIndex

或:

您的解决方案的问题是,如果使用它计算每个
小时的所有列值,并排除缺少的值,那么如果没有缺少的值,将获得具有相同值的多个列。可能的解决方案是在
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()
assign()
方法执行此操作:

如果“日期和时间”列不是索引:

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'
现在,如果您打印
结果
,您将获得所需的输出:

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

您还可以使用
groupby()
assign()
方法执行此操作:

如果“日期和时间”列不是索引:

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'
现在,如果您打印
结果
,您将获得所需的输出:

      count
hour    
0       1
1       2
2       2
10      1
23      3
new_dh['hour']=new_dh.index.map(λx:x.hour)
新建_dh.groupby('hour')['hour'].count()
结果

小时
0     2
1     2
2     2
10    1
23    3
名称:小时,数据类型:int64
如果您需要一个数据帧作为结果:

new_dh.groupby('hour')['hour'].count()。重命名('count')。为_frame()
在这种情况下,结果将是:

计数
时辰
0         2
1         2
2         2
10        1
23        3
new_dh['hour']=new_dh.index.map(λx:x.hour)
新建_dh.groupby('hour')['hour'].count()
结果

小时
0     2
1     2
2     2
10    1
23    3
名称:小时,数据类型:int64
如果您需要一个数据帧作为结果:

new_dh.groupby('hour')['hour'].count()。重命名('count')。为_frame()
在这种情况下,结果将是:

计数
时辰
0         2
1         2
2         2
10        1
23        3