Pandas:按日期分组,在其他列上聚合

2024-09-28 03:24:34 发布

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

我有这个数据框。有关许可证使用的信息:

    usuario feature     fini                    ffin                    delta
0   USER-1  PROGRAM-1   2016-06-30 21:03:21     2016-06-30 21:03:34     00:00:13
2   USER-1  PROGRAM-1   2016-06-30 21:09:20     2016-06-30 21:09:32     00:00:12
4   USER-1  PROGRAM-1   2016-06-30 21:14:40     2016-06-30 21:15:34     00:00:54
6   USER-1  PROGRAM-1   2016-06-30 21:16:42     2016-06-30 21:17:24     00:00:42
8   USER-1  PROGRAM-1   2016-06-30 21:18:09     2016-06-30 21:18:21     00:00:12

对不起,西班牙语的领域,但你知道的想法。fini表示fecha initial(初始日期)和ffinfecha final(结束日期),正如您猜测的delta是ffin-fini

所以,我想知道在这种情况下,USER-1在他一直工作的程序(program-1)中花费了多少时间。你知道吗

如果我做了一个table['delta'].sum()我得到了我想要的,它说他用了00:02:13。你知道吗

现在假设我有更多的用户,更多的功能,我想按天(也许是小时)对他们进行分组,看看人们是如何使用他们的许可证的

我试过重新取样,但我真的不明白它是怎么工作的。我看到有一个Grouper函数,但我没有安装它。你知道吗


Tags: 数据信息情况program领域featureinitialfinal
2条回答

下一行将帮助您按用户日期小时分组(仅供参考)。如果改为使用df['fini'].dt.hour,则它会将多天中同一小时的值相加):

df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()

将此应用于示例的扩展版本:

d = {
    'usuario':['USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-1','USER-2','USER-2'],
    'feature':['PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-1','PROGRAM-2','PROGRAM-2','PROGRAM-1','PROGRAM-1'],
    'fini':['2016-06-30 21:03:21','2016-06-30 21:09:20','2016-06-30 21:14:40','2016-06-30 21:16:42','2016-06-30 21:18:09', '2016-06-30 22:03:21','2016-06-30 22:09:20','2016-07-01 21:03:21','2016-07-01 22:09:20','2016-07-01 23:14:40','2016-06-30 17:16:42','2016-06-30 18:18:09'],
    'ffin':['2016-06-30 21:03:34','2016-06-30 21:09:32','2016-06-30 21:15:34','2016-06-30 21:17:24','2016-06-30 21:18:21', '2016-06-30 22:04:02','2016-06-30 22:09:51','2016-07-01 21:03:43','2016-07-01 22:10:12','2016-07-01 23:15:03','2016-06-30 17:17:23','2016-06-30 18:18:19']
}
df = pd.DataFrame(data=d)

date_cols = ['fini', 'ffin']
for col in date_cols:
    df[col] = pd.to_datetime(df[col])

df['delta'] = df['ffin'] - df['fini']

df.groupby([df['usuario'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()

输出如下:

usuario  fini               
USER-1   2016-06-30 21:00:00   00:02:13
         2016-06-30 22:00:00   00:01:12
         2016-07-01 21:00:00   00:00:22
         2016-07-01 22:00:00   00:00:52
         2016-07-01 23:00:00   00:00:23
USER-2   2016-06-30 17:00:00   00:00:41
         2016-06-30 18:00:00   00:00:10
Name: delta, dtype: timedelta64[ns]

另外,如果需要,向groupby添加功能也很简单:

df.groupby([df['usuario'], df['feature'], df['fini'].apply(lambda x: x.round('h'))]).delta.sum()

输出:

usuario  feature    fini               
USER-1   PROGRAM-1  2016-06-30 21:00:00   00:02:13
                    2016-06-30 22:00:00   00:01:12
                    2016-07-01 21:00:00   00:00:22
         PROGRAM-2  2016-07-01 22:00:00   00:00:52
                    2016-07-01 23:00:00   00:00:23
USER-2   PROGRAM-1  2016-06-30 17:00:00   00:00:41
                    2016-06-30 18:00:00   00:00:10
Name: delta, dtype: timedelta64[ns]

这是按usuario和日期对数据进行分组的代码(如fini中提供的)。如果需要不同的分组方案(例如,基于日期和小时),可以相应地修改:

import pandas as pd

df = pd.DataFrame({'usuario': ['USER-1']*5,
                   'feature': ['PROGRAM-1']*5,
                   'fini': ['2016-06-30 21:03:21',
                            '2016-06-30 21:09:20',
                            '2016-06-30 21:14:40',
                            '2016-07-30 21:16:42',
                            '2016-07-30 21:18:09'],
                   'ffin': ['2016-06-30 21:03:34',
                            '2016-06-30 21:09:32',
                            '2016-06-30 21:15:34',
                            '2016-07-30 21:17:24',
                            '2016-07-30 21:18:21'],
                   'delta': ['00:00:13',
                             '00:00:12',
                             '00:00:54',
                             '00:00:42',
                             '00:00:12']})

# proper formatting for columns
df.fini = pd.to_datetime(df.fini)
df.ffin = pd.to_datetime(df.ffin)
df.delta = pd.to_timedelta(df.delta)

print(df.groupby([df.usuario, df.fini.dt.date]).delta.sum())
#usuario  fini      
#USER-1   2016-06-30   00:01:19
#         2016-07-30   00:00:54
#Name: delta, dtype: timedelta64[ns]

相关问题 更多 >

    热门问题