Python 如何获得每组每小时的平均绝对频率?

Python 如何获得每组每小时的平均绝对频率?,python,pandas,Python,Pandas,我有以下数据帧: df = Id Datetime 1 2017-03-02 18:06:20 1 2017-03-02 18:05:10 1 2017-04-01 18:04:09 1 2017-03-02 19:06:50 1 2017-04-01 19:07:22 2 2017-03-03 18:09:15

我有以下数据帧:

df =
    Id         Datetime
    1          2017-03-02 18:06:20
    1          2017-03-02 18:05:10
    1          2017-04-01 18:04:09
    1          2017-03-02 19:06:50
    1          2017-04-01 19:07:22
    2          2017-03-03 18:09:15
    2          2017-05-03 19:07:05
    2          2017-05-03 20:19:08
我想知道每个
ID
每小时的平均绝对频率。换句话说,我需要计算
ID
每小时的绝对频率,在数天和数月内的平均值。预期结果如下:

ID   HOUR   FREQ
1    18     1.5
1    19     1
1    20     0
2    18     1
2    19     1
2    20     1
例如,如果
ID
等于1,则日期
2017-03-02
在18处有2个条目,日期
2017-04-01
在18处有1个条目。因此
FREQ
等于
1.5
,表示
HOUR
=18和
ID
=1

我有此代码,但未正确创建
结果

df["Hour"] = df["Datetimr"].apply(lambda x: x.hour)
result = df.groupby(["Id","Hour"]).agg({'Hour':'size'}).reset_index()
试试这个

df["Hour"] = pd.to_datetime(df.Datetime).dt.hour
df['Date'] = pd.to_datetime(df.Datetime).dt.date
df1=df.groupby(["Id","Hour","Date"]).size().reset_index()
df2=df1.groupby(["Id","Hour"])[0].mean().unstack('Hour').stack('Hour', dropna=False).reset_index()
df2.fillna(0)


Out[265]: 
   Id  Hour    0
0   1    18  1.5
1   1    19  1.0
2   1    20  0.0
3   2    18  1.0
4   2    19  1.0
5   2    20  1.0
试试这个

df["Hour"] = pd.to_datetime(df.Datetime).dt.hour
df['Date'] = pd.to_datetime(df.Datetime).dt.date
df1=df.groupby(["Id","Hour","Date"]).size().reset_index()
df2=df1.groupby(["Id","Hour"])[0].mean().unstack('Hour').stack('Hour', dropna=False).reset_index()
df2.fillna(0)


Out[265]: 
   Id  Hour    0
0   1    18  1.5
1   1    19  1.0
2   1    20  0.0
3   2    18  1.0
4   2    19  1.0
5   2    20  1.0
使用:

使用:



根据您的代码,有三个
18
实例,您的问题也没有意义,您如何获得
1.5
@dmitrypoloskiy:ID等于1,2017-03-02有两个18实例,2017-04-01有一个实例。那么,2和1的平均值是1.5,不是吗?@Dmitrypoloskiy:想象一下,今天在18:00到19:00之间有10名访客,而昨天在同一时间段有5名访客。那么,这两天的平均参观人数是多少
(10+5)/2=15/2=7.5
根据您的代码,有三个
18
实例,而且您的问题也没有意义,您如何获得
1.5
@DmitryColonskiy:ID等于1,2017-03-02有两个18实例,2017-04-01有一个实例。那么,2和1的平均值是1.5,不是吗?@Dmitrypoloskiy:想象一下,今天在18:00到19:00之间有10名访客,而昨天在同一时间段有5名访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5计数应在数天内取平均值。我不需要估计在所有的日子里总共有18个人。我想知道每天每小时的平均计数。想象一下,今天在18:00到19:00之间有10位访客,而昨天在同一时间段内有5位访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5我理解为什么(1,18)的频率是1.5。但是为什么(1,19)得到2呢?你在这方面是完全正确的。(1,19)等于1。很抱歉。希望所有疑问现在都澄清。仍然缺少一行…
1200
Aha。见第二个答案。他明白了。计数应该是几天的平均值。我不需要估计在所有的日子里总共有18个人。我想知道每天每小时的平均计数。想象一下,今天在18:00到19:00之间有10位访客,而昨天在同一时间段内有5位访客。那么,这两天的平均参观人数是多少<代码>(10+5)/2=15/2=7.5我理解为什么(1,18)的频率是1.5。但是为什么(1,19)得到2呢?你在这方面是完全正确的。(1,19)等于1。很抱歉。希望所有疑问现在都澄清。仍然缺少一行…
1200
Aha。见第二个答案。他明白了。在我的数据框中,
Datetime
的类型是
datetime64[ns]
。如果我执行
df[“Datetime”].apply(lambda x:x.date)
然后打印值,我会看到类似
的内容,我正在使用您的示例数据,如果您能提供更多信息,我们可以尝试帮助您。或者您可以使用这个..
df.Datetime.astype(str).str[0:10]
要获取我的数据框中的
日期
,其类型为
datetime64[ns]
。如果我执行
df[“Datetime”].apply(lambda x:x.date)
然后打印值,我会看到类似
的内容,我正在使用您的示例数据,如果您能提供更多信息,我们可以尝试帮助您。或者您可以使用这个..
df.Datetime.astype(str).str[0:10]
来获取
日期
#if necessary convert to datetime
df['Datetime'] = pd.to_datetime(df['Datetime'])

#groupby by column, by hours and by dates
df = df.groupby([df['ID'],  df['Datetime'].dt.hour,  df['Datetime'].dt.date]).size()
#groupby by ID and hours
df1 = df.groupby(level=[0,1]).mean()
#add missing values by reindex by Multiindex
mux = pd.MultiIndex.from_product([df1.index.levels[0], df1.index.levels[1]], 
                                 names=df1.index.names)
df1 = df1.reindex(mux, fill_value=0).reset_index(name='FREQ')
print (df1)
   ID  Datetime  FREQ
0   1        18   1.5
1   1        19   1.0
2   1        20   0.0
3   2        18   1.0
4   2        19   1.0
5   2        20   1.0