【问题标题】:how to get users daily average time in pandas ,start time and end time如何在熊猫中获取用户每天的平均时间,开始时间和结束时间
【发布时间】:2022-01-11 12:34:53
【问题描述】:

我有两张表需要合并两张表并获取用户的登录时间和注销时间以及平均时间`

表名:AllLogin

id   login_date    login_time   user_id 

1   2021-12-29  21:45:42.061506    4
2   2021-12-30  15:47:56.740154    2
3   2021-12-30  19:50:20.742582    4
4   2021-12-30  19:55:41.187090    1
5   2022-01-03  17:31:53.078602    1
6   2022-01-03  17:32:31.224342    2
7   2022-01-03  19:12:03.104795    4
8   2022-01-04  15:40:22.111702    1
9   2022-01-05  16:07:42.412031    2
10  2022-01-05  16:07:57.733591    2
11  2022-01-05  16:08:31.979159    1

表名:AllLogout

id   logout_date    logout_time   user_id 
1   2022-01-06  14:51:14.752459     1
2   2022-01-06  14:51:59.060639     2
3   2022-01-10  13:48:54.729281     2
4   2022-01-10  14:04:54.520387     2
5   2022-01-10  14:05:31.098456     2

如何组合两张表,统计每天用户的平均时间, 用户多次登录和注销也多次我需要用户每天的平均时间 `

代码::

    queryset=AllLogin.objects.values('login_time')
    querySet3 = AllLogout.objects.values('logout_time')
  
    df1 = pd.DataFrame(queryset, columns = ['login_time','user'])
    df2 = pd.DataFrame(querySet3, columns = ['logout_time','user'])
    # print(df1,df2)
    # df_row = pd.concat([df1, df2], ignore_index=True)
    df = pd.concat([df1.reset_index(drop=True),df2.reset_index(drop=True)], axis=1)
    # means = df.groupby(pd.Grouper(freq='1D')).mean()

    df_row_reindex = pd.concat([df1, df2], ignore_index=True)

    df=pd.merge(df1, df2, on=['user']).set_index(['logout_time','user']).sum(axis=1)
    # df = (pd.to_datetime(df.logout_time) - pd.to_datetime(df.login_time)).dt.total_seconds()
    
    '''changed'''

    df['AllLogin_flag'] = 'AllLogin'
    df['AllLogout_flag'] = 'AllLogout'
    logout =df.rename(columns={'logout_date':'login_date','logout_time':'login_time'})
    # login1 = login.append(logout, ignore_index=True)
    # login1  = login1.sort_values(by=['user_id', 'login_date','login_time'])

【问题讨论】:

  • 将您的数据发布为数据框构造函数,例如df = pd.DataFrame({"user_id": [1, 2, 3, etc..]})

标签: python pandas database dataframe pandas-groupby


【解决方案1】:

这可以通过以下方式实现: 第 1 步:在每个数据中创建用于登录和注销的标志

login['flag'] = 'login'
logout['flag'] = 'logout'

第 2 步:重命名注销日期和时间

logout =logout.rename(columns={'logout_date':'login_date','logout_time':'login_time'})

第 3 步:连接到一个数据帧中

login1 = login.append(logout, ignore_index=True)

第 4 步:按用户 ID、日期和时间对值进行排序

login1  = login1.sort_values(by=['user_id', 'login_date','login_time'])
login1.reset_index(inplace = True)

第 5 步:创建 Shift 变量,假设一旦用户登录我们将有一个注销时间,因此 shift 会将它们放在一行中

login1['shift_user_id'] = login1['user_id'].shift(-1)
login1['shift_flag'] = login1['flag'].shift(-1)
login1['shift_login_time'] = login1['login_time'].shift(-1)

这个输出看起来像这样:

现在只需保留用户 == 转移用户 id 和标志 = 登录和转移标志 = 注销的记录,记录实际时间和班次时间的差异以及按日期分组,并在差异上应用平均值。这应该工作

【讨论】:

  • 请分享代码以获取更多参考..
  • rename() 得到了一个意外的关键字参数“列”
  • 请看一次,代码
猜你喜欢
  • 2022-01-24
  • 2012-10-29
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
相关资源
最近更新 更多