如何在 python 中分组而不是排序
How to group instead of sort in python
我有一个包含 140 个元素 ('activities') 的 json,我需要编写一个 python 程序将其转换为这个 ('user_sessions')。所以现在不是按 activity id 和其他信息分组,而是按 'user_id' 在某些条件下分组:
- 添加会话持续时间(以秒为单位)(answered_at - first_seen_at)
- 用户在该会话期间执行的活动的 ID 必须出现在末尾而不是开头(如 'activities')
- 如果 '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 的持续时间(这是我之前的)。
我有一个包含 140 个元素 ('activities') 的 json,我需要编写一个 python 程序将其转换为这个 ('user_sessions')。所以现在不是按 activity id 和其他信息分组,而是按 'user_id' 在某些条件下分组:
- 添加会话持续时间(以秒为单位)(answered_at - first_seen_at)
- 用户在该会话期间执行的活动的 ID 必须出现在末尾而不是开头(如 'activities')
- 如果 '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 的持续时间(这是我之前的)。