【问题标题】:Return number of occurrences based on hour - Pandas根据小时返回出现次数 - Pandas
【发布时间】:2019-08-17 13:25:58
【问题描述】:

我正在尝试返回按小时分组的最大值。我尝试使用以下方法来实现这一点,但有多个相同的时间(组)。我希望只返回每小时的最大值。

d = ({
    'Time' : ['0/1/1900 8:00:00','0/1/1900 9:59:00','0/1/1900 10:00:00','0/1/1900 12:29:00','0/1/1900 12:30:00','0/1/1900 13:00:00','0/1/1900 13:02:00','0/1/1900 13:15:00','0/1/1900 13:20:00','0/1/1900 18:10:00','0/1/1900 18:15:00','0/1/1900 18:20:00','0/1/1900 18:25:00','0/1/1900 18:45:00','0/1/1900 18:50:00','0/1/1900 19:05:00','0/1/1900 19:07:00','0/1/1900 21:57:00','0/1/1900 22:00:00','0/1/1900 22:30:00','0/1/1900 22:35:00','1/1/1900 3:00:00','1/1/1900 3:05:00','1/1/1900 3:20:00','1/1/1900 3:25:00'],                 
    'People' : [1,1,2,2,3,3,2,2,3,3,4,4,3,3,2,2,3,3,4,4,3,3,2,2,1],                      
     })

df = pd.DataFrame(data = d)

df['Time'] = ['/'.join([str(int(x.split('/')[0])+1)] + x.split('/')[1:]) for x in df['Time']]
df['Time'] = pd.to_datetime(df['Time'], format='%d/%m/%Y %H:%M:%S') 

df = df.groupby([pd.Grouper(key='Time',freq='H'),df.People]).size().reset_index(name='count')

print(df)

                  Time  People  count
0  1900-01-01 08:00:00       1      1
1  1900-01-01 09:00:00       1      1
2  1900-01-01 10:00:00       2      1
3  1900-01-01 12:00:00       2      1
4  1900-01-01 12:00:00       3      1
5  1900-01-01 13:00:00       2      2
6  1900-01-01 13:00:00       3      2
7  1900-01-01 18:00:00       2      1
8  1900-01-01 18:00:00       3      3
9  1900-01-01 18:00:00       4      2
10 1900-01-01 19:00:00       2      1
11 1900-01-01 19:00:00       3      1
12 1900-01-01 21:00:00       3      1
13 1900-01-01 22:00:00       3      1
14 1900-01-01 22:00:00       4      2
15 1900-01-02 03:00:00       1      1
16 1900-01-02 03:00:00       2      2
17 1900-01-02 03:00:00       3      1

预期输出:

              Time  People  count
0  1900-01-01 08:00:00       1      1
1  1900-01-01 09:00:00       1      1
2  1900-01-01 10:00:00       2      2
3  1900-01-01 12:00:00       2      3
4  1900-01-01 13:00:00       2      3
5  1900-01-01 18:00:00       2      4
6  1900-01-01 19:00:00       2      3
7  1900-01-01 21:00:00       3      3
8  1900-01-01 22:00:00       3      4
9  1900-01-02 03:00:00       1      3

【问题讨论】:

  • 您的预期结果是什么?
  • 每个日期的每个小时?还是所有日期的每个小时相结合?
  • @Chris。日期将超过一天,但如果有意义的话,时间将永远不会重叠。我查看了一个超过午夜的 20 小时时间范围
  • @coldspeed,这个已经被收录了
  • 您是否正在寻找df.groupby(df.Time.dt.floor('H'))['People'].count()

标签: python pandas datetime group-by


【解决方案1】:

使用pandas.DataFrame.groupby。给定df

                   Time  People
0   1900-01-01 08:00:00       1
1   1900-01-01 09:00:00       1
2   1900-01-01 10:00:00       2
3   1900-01-01 12:00:00       2
4   1900-01-01 12:00:00       3
5   1900-01-01 13:00:00       2
6   1900-01-01 13:00:00       3
7   1900-01-01 18:00:00       2
8   1900-01-01 18:00:00       3
9   1900-01-01 18:00:00       4
10  1900-01-01 19:00:00       2
11  1900-01-01 19:00:00       3
12  1900-01-01 21:00:00       3
13  1900-01-01 22:00:00       3
14  1900-01-01 22:00:00       4
15  1900-01-02 03:00:00       1
16  1900-01-02 03:00:00       2
17  1900-01-02 03:00:00       3

df.groupby('Time')['People'].max() 返回:

Time
1900-01-01 08:00:00    1
1900-01-01 09:00:00    1
1900-01-01 10:00:00    2
1900-01-01 12:00:00    3
1900-01-01 13:00:00    3
1900-01-01 18:00:00    4
1900-01-01 19:00:00    3
1900-01-01 21:00:00    3
1900-01-01 22:00:00    4
1900-01-02 03:00:00    3

【讨论】:

  • 谢谢@Chris。这可能必须是一个单独的问题。但是,将其分开是多么困难。作为返回每 15 分钟段的最大值,而不是每小时。
【解决方案2】:

要对项目本身进行更多控制,您可以遍历 df 的单个键并获取其他列的 max() 值,然后修改 他们随心所欲,然后重新创建一个df。这应该有效:

import pandas as pd

d = ({
    'Time' : ['0/1/1900 8:00:00','0/1/1900 9:59:00','0/1/1900 10:00:00','0/1/1900 12:29:00','0/1/1900 12:30:00','0/1/1900 13:00:00','0/1/1900 13:02:00','0/1/1900 13:15:00','0/1/1900 13:20:00','0/1/1900 18:10:00','0/1/1900 18:15:00','0/1/1900 18:20:00','0/1/1900 18:25:00','0/1/1900 18:45:00','0/1/1900 18:50:00','0/1/1900 19:05:00','0/1/1900 19:07:00','0/1/1900 21:57:00','0/1/1900 22:00:00','0/1/1900 22:30:00','0/1/1900 22:35:00','1/1/1900 3:00:00','1/1/1900 3:05:00','1/1/1900 3:20:00','1/1/1900 3:25:00'],
    'People' : [1,1,2,2,3,3,2,2,3,3,4,4,3,3,2,2,3,3,4,4,3,3,2,2,1],
     })

df = pd.DataFrame(data = d)

df['Time'] = ['/'.join([str(int(x.split('/')[0])+1)] + x.split('/')[1:]) for x in df['Time']]
df['Time'] = pd.to_datetime(df['Time'], format='%d/%m/%Y %H:%M:%S')


df = df.groupby([pd.Grouper(key='Time',freq='H'),df.People]).size().reset_index(name='count')

single_times = set(df['Time'])
p, c = [ [] for i in range(2) ]
for v in single_times :
    c.append(max(df.loc[df['Time'] == v]['count']))
    p.append(max(df.loc[df['Time'] == v]['People']))

###make something with c/p

dfdata = {
    'Time' : list(single_times),
    'People' : p,
    'Count' : c
}
df2 = pd.DataFrame(data = dfdata)

print(df2)

可能会有更快的方法。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2020-04-16
    • 2018-12-26
    相关资源
    最近更新 更多