Python 如何为仅使用小时的datetimeindex的dataframe设置groupby
我有一个名为new_dh of web request的数据框架,看起来像(有更多的列)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
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