У меня есть 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)