如何在 python 中分组而不是排序

How to group instead of sort in python

我有一个包含 140 个元素 ('activities') 的 json,我需要编写一个 python 程序将其转换为这个 ('user_sessions')。所以现在不是按 activity id 和其他信息分组,而是按 'user_id' 在某些条件下分组:

  1. 添加会话持续时间(以秒为单位)(answered_at - first_seen_at)
  2. 用户在该会话期间执行的活动的 ID 必须出现在末尾而不是开头(如 'activities')
  3. 如果 'first_seen_at' 和 'answered_at' 之间超过五分钟,则计为新会话。

我的问题是,如何按用户id分组,并检查同一个id内的所有数据是否满足上述条件?

我使用 lambda 函数来容纳 user_id data['activities'].sort(key = lambda x: x ['user_id']) 但实际上只是按 user_id 排序,我需要按 user_id.[=14= 对它进行分组]

这是 json 的信息,'activities' 是它当前的排序方式,'user_sessions' 我需要它的排序方式。

{"activities": 
[ 
{ 
"id": 198891, 
"user_id": "emr5zqid", 
"answered_at": "2021-09-13T02:38:34.117-04:00", 
"first_seen_at": "2021-09-13T02:38:16.117-04:00" 
}, 

  
{ 
"user_sessions": { 
"3pyg3scx": [ 
{ 
"ended_at": "2021-09-10T19:51:26.799-04:00", 
"started_at": "2021-09-10T19:22:23.799-04:00", 
"activity_ids": [ 
251953, 
379044 
], 
"duration_seconds": 173.0 
}, 
{ 
"ended_at": "2021-09-11T04:33:50.799-04:00",
"started_at": "2021-09-11T04:05:20.799-04:00", 
"activity_ids": [
296400, 
247727, 
461955 
], 
"duration_seconds": 171.3 
} 
]

这是我的代码,但实际上我没有什么可展示的。

import json
import datetime

#Leemos el json
with open('/Users/kenyacastellanos/Downloads/data.json') as json_data_file:
    data = json.load(json_data_file)
    #print(data)

# Realizamos el ordenamiento por llave, la llave es user_id, creamos una funcion lambda para el ordenamiento
data['activities'].sort(key = lambda x: x['user_id'])

for x in range(len(data['activities'])):
# Duration
    date1 = datetime.datetime.fromisoformat(data['activities'][x]['answered_at'])
    date2 = datetime.datetime.fromisoformat(data['activities'][x]['first_seen_at'])
    difference_date = (date1-date2)
    print("Duration in seconds:", difference_date.seconds, difference_date.microseconds)
    

好的,所以我这样做了。

user_sessions.append((x['user_id'], x['id'], difference_date))

print("User sessions: ", user_sessions)

for group in itertools.groupby(user_sessions, key=lambda x: x[0]):
    print(group[0], end=" -> Duration in secs: ")
    tot = datetime.timedelta(seconds=0)
    for session in group[1]:
        tot += session[2]
    if tot <= datetime.timedelta(seconds=300):
        print(tot.days*86400 + tot.seconds)

首先,我附加了我想要使用的键,然后打印以确保它是我想要的,然后使用 itertools 我能够按 user_id 对它们进行排序,这也是我想要的,我计算了会话的总持续时间,而不仅仅是 activity 的持续时间(这是我之前的)。