按主机名分组。每小时(主机上)会话的平均数

2024-10-06 10:21:27 发布

您现在位置:Python中文网/ 问答频道 /正文

数据帧如下所示

              datetime   hostname  sessions
0  2020-10-27 00:00:05  server001        22
1  2020-10-27 00:00:10  server001        25
2  2020-10-27 00:00:15  server001        21
3  2020-10-27 01:00:05  server001        30
4  2020-10-27 01:00:10  server001        30
5  2020-10-27 01:00:15  server001        35
6  2020-10-27 00:00:05  server002        15
7  2020-10-27 00:00:10  server002        10
8  2020-10-27 00:00:15  server002        11
9  2020-10-27 01:00:05  server002        19
10 2020-10-27 01:00:10  server002        22
11 2020-10-27 01:00:15  server002        18

我试图通过单个主机名显示每小时的平均会话数

所以我会得到像这样的东西

              datetime   hostname  sessions
0  2020-10-27 00:00:00  server001        23
1  2020-10-27 01:00:00  server001        32
2  2020-10-27 00:00:00  server002        12
3  2020-10-27 01:00:00  server002        20

我认为我的分组是错误的,因为当我尝试这样做时,我得到的结果通常是在date by hour中排序的任何给定主机名的最大平均每小时值

例如,我可能会看到

                hostname   datetime     sessions
0  2020-10-27  server001   00:00:00           23
1  2020-10-27              01:00:00           32
2  2020-10-27  server002   02:00:00           12
3  2020-10-27  server003   03:00:00           20

而不是列出每个主机名的完整24小时

我尝试的代码是:

df = df.groupby(['hostname']).resample(
        'H', on='datetime'
        ).agg({'sessions': 'mean'}).round(0).astype(int)

我需要做什么才能得到想要的结果


Tags: 数据dfdatetimedateby排序错误hostname
2条回答

编辑:请参见Serge de Gosson de Varnnes的第二个示例。这正是我想要的

我相信我已经找到了解决问题的办法。我犯的第一个错误是没有按小时创建索引。我相信阿米特·库马尔(Amit Kumar)是在谈论这件事,但当时我不太明白他的意思。Serge de Gosson de Varnnes也为他的例子中的数据建立了一个索引

我将使用Serge de Gosson de Varnnes的我的数据插入示例,因此任何发现这一点的人都可以立即使用示例并检查输出:

import pandas as pd

d ={'datetime' :['2020-10-27 00:00:05','2020-10-27 00:00:10','2020-10-27 00:00:15','2020-10-27 01:00:05','2020-10-27 01:00:10','2020-10-27 01:00:15','2020-10-27 00:00:05','2020-10-27 00:00:10','2020-10-27 00:00:15','2020-10-27 01:00:05','2020-10-27 01:00:10','2020-10-27 01:00:15'],
   'hostname':['server001','server001','server001','server001','server001','server001','server002','server002','server002','server002','server002','server002'],
   'sessions':[ 22,25,21 ,30,30,35,15,10, 11,19,22,18]}       
df = pd.DataFrame(data=d)
df['datetime'] =  pd.to_datetime(df['datetime'])
df = df.set_index(pd.DatetimeIndex(df['datetime']))

hour_index = df.index.hour

df = groupby([hour_index, 'hostname'])['sessions'].mean().round(0).astype(int)

with pd.option_context(
        'display.max_rows',
         None,
         'display.max_columns',
         None
         ):
    print(df)

此处应用round和astype方法将整数四舍五入到最接近的整数。这不是我以前指定的东西,因为我已经知道如何处理它,但为了完整性,我将把它放在这里

这里的with语句允许打印完整的数据帧(请注意大数据帧,因为一次在屏幕上打印的数据可能很多)

输出:

datetime  hostname 
0         server001    23
          server002    12
1         server001    32
          server002    20

这里唯一的改进是将小时索引设置为带有时间戳的时钟格式

另一个问题没有解决,但超出了这个特定问题的范围,即datetime列中是否有多天。我将在每天每个数据帧中分离我的数据帧来处理这个问题。但如果我能找到更好的方法来处理每一天,我会把它加入到我的解决方案中

下面是一个基于您提供的数据的示例。我已经添加了将日期转换为datetime(如果它们是对象)以及将datetime设置为datetimeindex的步骤,以便使用resample。事情会是这样的:

import pandas as pd
import numpy as np
d ={'datetime' :['2020-10-27 00:00:05','2020-10-27 00:00:10','2020-10-27 00:00:15','2020-10-27 01:00:05','2020-10-27 01:00:10','2020-10-27 01:00:15','2020-10-27 00:00:05','2020-10-27 00:00:10','2020-10-27 00:00:15','2020-10-27 01:00:05','2020-10-27 01:00:10','2020-10-27 01:00:15'],
   'hostname':['server001','server001','server001','server001','server001','server001','server002','server002','server002','server002','server002','server002'],
   'sessions':[ 22,25,21 ,30,30,35,15,10, 11,19,22,18]}       
df = pd.DataFrame(data=d)
df['datetime'] =  pd.to_datetime(df['datetime'])
df = df.set_index(pd.DatetimeIndex(df['datetime']))
df.resample('H').mean()

实际上,您可以修改此示例以适合其他用途。正如我理解你的问题,你想计算每小时平均会话数。如果需要其他groupby.s,请检查resample-函数

除此之外的另一种方法是对datetime进行排序,然后取平均值:

df['datetime'] =  pd.to_datetime(df['datetime'])
df['Date'] = [x.strftime('%Y-%m-%d') for x in df['datetime'].tolist()]
df['Time'] = ['%s:00' % x.strftime('%H') for x in df['datetime'].tolist()]
df_1 = df.groupby(['Date', 'Time', 'hostname']).mean()

enter image description here

相关问题 更多 >