Язык программирования Python

Как сгруппировать элементы списка с определенными условиями?

У меня есть json со 140 такими элементами (‘activities’), и мне нужно написать программу на python, чтобы преобразовать его в этот (‘user_sessions’). То есть теперь вместо группировки по id активности и другой информации, теперь она группируется по ‘user_id’ с определенными условиями:

  • Добавить продолжительность сеанса в секундах (answered_at- first_seen_at)
  • Идентификатор действий, выполненных (пользователем) во время этой сессии, должен появляться в конце, а не в начале (как в ‘activities’).
  • Если между ‘first_seen_at’ и ‘answered_at’ прошло более пяти минут, это считается новым сеансом.

Мой вопрос в том, как я могу сгруппировать данные по id пользователя и проверить все данные в пределах одного id, чтобы они соответствовали вышеуказанным условиям?

Я использовал лямбда-функцию для сортировки по user_id data[‘activities’].sort(key=lambda x: x[‘user_id’]), но она буквально сортирует только по user_id.

Пока что это мой код, не знаю, сильно ли он поможет:

import json import datetime with open('/Users/dimitriy/Downloads/data.json') as json_data_file: data = json.load(json_data_file) data['activities'].sort(key=lambda x: x['user_id']) for x in range(len(data["activities"])): #print("Новый заказ:", data['activities'][:]) date1 = datetime.datetime.fromisoformat(data['activities'][x]['answered_at']) date2 = datetime.datetime.fromisoformat(data['activities'][x]['first_seen_at']) duration = (date1-date2) print("Длительность в секундах:", duration.seconds, duration.microseconds) print(x)
Code language: Python (python)

Вот что содержит json (activitites) и как он должен выглядеть после (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 } ]
Code language: JSON / JSON with Comments (json)

Решение

Append, чтобы добавить ключи, с которыми я хотел работать, print – чтобы убедиться, что он печатает так, как я хочу, и в конце я использовал itertools, чтобы иметь возможность группировать,

user_sessions.append((x['user_id'], x['id'], difference_date)) print("Пользовательские сессии: ", user_sessions) for group in itertools.groupby(user_sessions, key=lambda x: x[0]): print(group[0], end=" -> Длительность в секундах: ") 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)
Code language: Python (python)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *