Я новичок в python и пробовал некоторые проекты дома. Я вытащил данные json из API и отформатировал только те данные, которые мне нужны, но мне нужно удалить повторяющиеся (id) записи с самыми старыми датами.
мой json выглядит так:
[
{
"id": 1,
"date": "2019-06-20T10:39:03.915Z",
"name": "xxx"
},
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
},
]
Я пытался использовать (данные - это мой файл json):
for item in data:
oldest_time = min(item.get('date'))
d = {
'id': item.get('id'),
'date': oldest_time,
'name': item.get('name')
}
new.append(d)
with open('new.json', 'w') as f:
json.dump(new, f, indent=2)
Я надеялся получить следующий вывод в new.json, однако даты кажутся пустыми:
[
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
},
]
Мой код может кому-то показаться плохим, но, пожалуйста, извините, так как я не долго программировал на python. Искал похожие темы, но ничего не нашел. Любая помощь будет здорово.
Так является ли datalist из dictionary элементов?
Загляните в datetime.strptime(...)






Вы можете отформатировать данные с помощью модуля datetime. Это может быть вашим ключом для сортировки list от самой старой записи к самой новой:
import datetime
data = [{
"id": 1,
"date": "2019-06-20T10:39:03.915Z",
"name": "xxx"
},
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
}]
sorted(data, key=lambda x: datetime.datetime.strptime(x['date'], '%Y-%m-%dT%H:%M:%S.%fZ'))
[{'id': 2, 'date': '2019-06-19T10:55:21.741Z', 'name': 'xxx'},
{'id': 1, 'date': '2019-06-20T07:50:53.533Z', 'name': 'xxx'},
{'id': 1, 'date': '2019-06-20T10:39:03.915Z', 'name': 'xxx'}]
Если вам нужны самые новые записи первыми, вы просто передаете ключевое слово reverse в sorted:
sorted(data, key=lambda x: datetime.datetime.strptime(x['date'], '%Y-%m-%dT%H:%M:%S.%fZ'), reverse=True)
[{'id': 1, 'date': '2019-06-20T10:39:03.915Z', 'name': 'xxx'},
{'id': 1, 'date': '2019-06-20T07:50:53.533Z', 'name': 'xxx'},
{'id': 2, 'date': '2019-06-19T10:55:21.741Z', 'name': 'xxx'}
Теперь вы можете сгруппировать свои результаты по id и использовать приведенное выше, чтобы получить самую старую запись:
# we will use a defaultdict here because it lends itself to this kind of grouping problem
from collections import defaultdict
d = defaultdict(list)
for item in data:
d[item['id']].append(item) # create your lists grouped by id
# d now looks like
#{1: [{'id': 1, 'date': '2019-06-20T10:39:03.915Z', 'name': 'xxx'},
# {'id': 1, 'date': '2019-06-20T07:50:53.533Z', 'name': 'xxx'}],
# 2: [{'id': 2, 'date': '2019-06-19T10:55:21.741Z', 'name': 'xxx'}]}
# Now, sort and use `pop` to grab the oldest, since the reversed
# option will put the newest date first and the oldest last
for k, v in d.items():
# v will be lists, sort them using the method above,
# and pop() will return the last element of the list
v = sorted(v, key = lambda x: datetime.datetime.strptime(x['date'], '%Y-%m-%dT%H:%M:%S.%fZ'), reverse=True).pop()
d[k] = v
list(d.values())
[{'id': 1, 'date': '2019-06-20T07:50:53.533Z', 'name': 'xxx'}, {'id': 2, 'date': '2019-06-19T10:55:21.741Z', 'name': 'xxx'}]
Спасибо C.Nivs, я попробую. Я пытался создать новый список только с самой старой датой для каждого уникального идентификатора.
Спасибо @C.Nivs, это прекрасно работает. Очень ценю ответы (теперь нужно исследовать и действительно понять это). Спасибо еще раз!!!
Имеющиеся у вас данные json не соответствуют формату JSON согласно Технические характеристики.