【问题标题】:groupby month-day hour using pandas使用熊猫分组按月日小时
【发布时间】:2020-03-30 23:59:34
【问题描述】:

这是我的数据框的样子:

                   user_id  time    hour weekday    location 
updated_at                                          
2019-09-02 05:29:00 29279   5:29:35  5   0            A      
2019-09-02 05:29:00 29279   5:29:39  5   0            A      
2019-09-02 05:29:00 29279   5:29:42  5   0            A      
2019-09-02 05:29:00 29279   5:29:49  5   0            B       
2019-09-02 05:32:00 29279   5:32:28  5   0            C       

对于每一天,我想要每个位置的每小时行总和

*想要达到这样的目标df.groupby(["month-day hour", "location]).count()

现在我已经创建了额外的列来加入月日小时

               user_id  time    hour weekday    location  date-hour
updated_at                                          
2019-09-02 05:29:00 29279   5:29:35  5   0            A       9-2 5
2019-09-02 05:29:00 29279   5:29:39  5   0            A       9-2 5
2019-09-02 05:29:00 29279   5:29:42  5   0            A       9-2 5
2019-09-02 05:29:00 29279   5:29:49  5   0            B       9-2 5
2019-09-02 05:32:00 29279   5:32:28  5   0            C       9-2 5

然后使用df.groupby(["date-hour", "location]).count(),这似乎可以完成这项工作,但是由于现在索引是“月-日小时”格式,我无法利用 datetimeindex。

如果我不能实现*,我该如何更改“月日小时”格式以更正日期时间。 当我尝试pd.to_datetime("9-10 11") 时,它会将 11 视为一年给我Timestamp('2011-09-10 00:00:00')

【问题讨论】:

  • 我能问一下总和吗?您是否正在查找一小时在列中出现的次数?
  • 行的总和。已修改,谢谢反馈。

标签: python pandas


【解决方案1】:

只需从 datetime 对象中删除分钟和秒信息。应该这样做:

数据

df = pd.DataFrame([['2019-09-02 05:29:00', '29279', 'A'],
 ['2019-09-02 05:29:00', '29279', 'A'],
 ['2019-09-02 05:29:00', '29279', 'A'],
 ['2019-09-02 05:29:00', '29279', 'B'],
 ['2019-09-02 05:32:00', '29279', 'C']], columns = ['datetime', 'user_id', 'location'])
df['datetime'] = pd.to_datetime(df['datetime'])

print(df.to_string())



             datetime user_id location
0 2019-09-02 05:29:00   29279        A
1 2019-09-02 05:29:00   29279        A
2 2019-09-02 05:29:00   29279        A
3 2019-09-02 05:29:00   29279        B
4 2019-09-02 05:32:00   29279        C

解决方案

df['time_hour'] = df['datetime'].map(lambda x: x.replace(minute=0, second=0))

输出

print(df.groupby(['time_hour', 'location']).size().reset_index().to_string())

            time_hour location  0
0 2019-09-02 05:00:00        A  3
1 2019-09-02 05:00:00        B  1
2 2019-09-02 05:00:00        C  1

【讨论】:

    【解决方案2】:

    我相信你只需要 groupby df.index.floor('H') 和 location

    df_out = (df.groupby([df.index.floor('H'), 'location']).location.count()
                .reset_index(1, name='count'))
    
    Out[311]:
                        location  count
    updated_at
    2019-09-02 05:00:00  A            3
    2019-09-02 05:00:00  B            1
    2019-09-02 05:00:00  C            1
    

    【讨论】:

      猜你喜欢
      • 2016-06-24
      • 2023-02-16
      • 2019-10-10
      • 2014-12-15
      • 1970-01-01
      • 2023-03-20
      • 2020-03-24
      • 2018-04-01
      相关资源
      最近更新 更多