Поиск самой ранней даты путем циклического просмотра файла json с общими идентификаторами

Я новичок в 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. Искал похожие темы, но ничего не нашел. Любая помощь будет здорово.

Имеющиеся у вас данные json не соответствуют формату JSON согласно Технические характеристики.

martineau 21.06.2019 00:04

Так является ли datalist из dictionary элементов?

C.Nivs 21.06.2019 00:08

Загляните в datetime.strptime(...)

Error - Syntactical Remorse 21.06.2019 00:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
347
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете отформатировать данные с помощью модуля 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, я попробую. Я пытался создать новый список только с самой старой датой для каждого уникального идентификатора.

Gordo 21.06.2019 00:50

Спасибо @C.Nivs, это прекрасно работает. Очень ценю ответы (теперь нужно исследовать и действительно понять это). Спасибо еще раз!!!

Gordo 21.06.2019 07:16

Другие вопросы по теме