如何从登录和注销表中同时标识用户?

2024-04-26 17:45:01 发布

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

下表显示了给定软件的登录和注销时间。你知道吗

USER_NAME USER_ROLE GMT_LOGIN_TIME      GMT_LOGOUT_TIME       LOGIN_DURATION 
ABCD      SUP_235   2017-12-15 11:05:25 2017-12-15 11:09:01           216.0
ABCE      SUP_235   2017-12-15 11:23:14 2017-12-15 11:33:17           603.0
ABCF      USER_285  2017-12-15 11:44:12 2017-12-15 12:07:52          1420.0
ABCG      SUP_230   2017-12-15 18:43:17 2017-12-15 19:00:20          1023.0
ABCH      USER_245  2017-12-15 10:36:59 2017-12-15 11:42:00          3901.0

如何识别同时使用的用户?我将不得不用Python来做这件事,但我不担心用那种编程语言实现。我想了解逻辑本身。你知道吗

在上述示例中,用户ABCD、ABCE和ABCH是唯一同时出现的。你知道吗


Tags: 用户name软件time时间loginrolesup
1条回答
网友
1楼 · 发布于 2024-04-26 17:45:01

下面是一种使用pandas的方法:

from StringIO import StringIO

# read data into dataframe
data = StringIO("""USER_NAME,USER_ROLE,GMT_LOGIN_TIME,GMT_LOGOUT_TIME,LOGIN_DURATION 
ABCD,SUP_235,2017-12-15 11:05:25,2017-12-15 11:09:01,216.0
ABCE,SUP_235,2017-12-15 11:23:14,2017-12-15 11:33:17,603.0
ABCF,USER_285,2017-12-15 11:44:12,2017-12-15 12:07:52,1420.0
ABCG,SUP_230,2017-12-15 18:43:17,2017-12-15 19:00:20,1023.0
ABCH,USER_245,2017-12-15 10:36:59,2017-12-15 11:42:00,3901.0""")
df = pd.read_csv(data, sep=",")

# create a new column for simultaneous
df['simultaneous'] = 0

# loop through dataframe and check condition
for i in df.index:
    login, logout = df.loc[i,'GMT_LOGIN_TIME'], df.loc[i,'GMT_LOGOUT_TIME']
    this_index = df.index.isin([i])
    df.loc[i, 'simultaneous'] = int(any(
        (df[~this_index]['GMT_LOGIN_TIME'] <= logout) & (df[~this_index]['GMT_LOGOUT_TIME'] >= login)
    ))

输出:

  USER_NAME USER_ROLE       GMT_LOGIN_TIME      GMT_LOGOUT_TIME  \
0      ABCD   SUP_235  2017-12-15 11:05:25  2017-12-15 11:09:01   
1      ABCE   SUP_235  2017-12-15 11:23:14  2017-12-15 11:33:17   
2      ABCF  USER_285  2017-12-15 11:44:12  2017-12-15 12:07:52   
3      ABCG   SUP_230  2017-12-15 18:43:17  2017-12-15 19:00:20   
4      ABCH  USER_245  2017-12-15 10:36:59  2017-12-15 11:42:00   

   LOGIN_DURATION   simultaneous  
0            216.0             1  
1            603.0             1  
2           1420.0             0  
3           1023.0             0  
4           3901.0             1  

这是正确的,因为ABCDABCE都与ABCH同时发生。你知道吗

逻辑解释:

  1. 我们循环遍历数据帧的每一行,并获取该用户的loginlogout时间。

  2. 接下来我们要检查所有其他行是否有重叠,因此我们创建this_index作为指向当前行的索引器。使用位反转运算符(~),我们可以用df[~this_index]选择其他行。

  3. 对于其他行,我们使用any函数检查它们是否满足overlap condition。因为它返回boolean,所以我们转换为int。如果您想查看有多少其他连接与此连接重叠,我们也可以使用sum(condition)

  4. int(any(condition))的结果放入'simultaneous'列。

请参阅本页了解重叠时间范围背后的逻辑: Determine Whether Two Date Ranges Overlap

编辑:一种更大的方式

在pandas中循环行对于大型表来说很慢。下面是一种使用pandas.Dataframe.apply()实现相同结果的方法,应该更快。你知道吗

df['simultaneous'] = df.apply(
    lambda x: int(
        any(
            (df[df['USER_NAME'] != x['USER_NAME']]['GMT_LOGIN_TIME'] <= x['GMT_LOGOUT_TIME']) &\
            (df[df['USER_NAME'] != x['USER_NAME']]['GMT_LOGOUT_TIME'] >= x['GMT_LOGIN_TIME'])
        )
    ),
    axis=1
)

相关问题 更多 >