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



我有一个json与140这些元素('活动'),我需要做一个python程序来转换它到这个('user_sessions')。所以现在不是按活动id和其他信息分组,而是按'user_id'在某些条件下分组:

  1. 增加会话持续时间,单位为秒(answered_at - firstrongeen_at)
  2. 用户在会话期间执行的活动的id必须出现在结束而不是开始(如'activities')
  3. 如果'firstrongeen_at'和'answered_at'之间的间隔超过5分钟,则视为新会话。

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

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

这是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对它们进行排序,这就是我想要的,此外,我计算了会话的总持续时间,而不仅仅是一个活动的持续时间(这是我之前的)。

最新更新