Поиск новейшей даты из JSON в python - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы найти поездку с самой новой датой и временем отправления (наиболее далеко) от JSON.

[
  {
    "DEPARTURE PORT": "Ischia",
    "ARRIVAL PORT": "Napoli Molo Beverello",
    "DEPARTURE DATE": "2019-02-20",
    "DEPARTURE TIME": "06:30",
    "ARRIVAL DATE": "2019-02-18",
    "ARRIVAL TIME": "07:20",
    "DURATION": "00:50:00"
  },
  {
    "DEPARTURE PORT": "Forio",
    "ARRIVAL PORT": "Napoli Molo Beverello",
    "DEPARTURE DATE": "2019-02-16",
    "DEPARTURE TIME": "06:45",
    "ARRIVAL DATE": "2019-02-16",
    "ARRIVAL TIME": "08:05",
    "DURATION": "01:20:00"
  },
  {
    "DEPARTURE PORT": "Napoli Molo Beverello",
    "ARRIVAL PORT": "Ischia",
    "DEPARTURE DATE": "2019-02-18",
    "DEPARTURE TIME": "07:05",
    "ARRIVAL DATE": "2019-02-18",
    "ARRIVAL TIME": "08:25",
    "DURATION": "01:20:00"
  }
]

Я пробовал следующее, но есть ли лучший способ сделать это?

#Read the JSON
with open('livedepartures/alilauro.json', encoding='utf-8') as data_file:
    alilauro_data = json.loads(data_file.read())

 newest_alilauro_date = max(
       datetime.strptime( d + " " + t, "%Y-%m-%d %H:%M" ) 
       for d, t in zip( alilauro_data["DEPARTURE DATE"],  alilauro_data["DEPARTURE TIME"])
)

Ответы [ 5 ]

0 голосов
/ 18 февраля 2019

У вас нет оснований для архивирования здесь, потому что json выдаст список словарей.Вы можете просто сделать:

#Read the JSON
with open('livedepartures/alilauro.json', encoding='utf-8') as data_file:
    alilauro_data = json.loads(data_file.read())

newest_alilauro_date = max((datetime.datetime.strptime(it["DEPARTURE DATE"]+it["DEPARTURE TIME"],
                "%Y-%m-%d%H:%M") for it in alilauro_data))
0 голосов
/ 18 февраля 2019

После того, как вы это расшифровали, вам нужно только max.Сначала определите функцию для извлечения даты и времени отправления из диктанта.operator.itemgetter делает это простым.

from operator import itemgetter

# get_departure({..., "DEPARTURE DATE": "2019-02-20",  "DEPARTURE TIME": "06:30", ...})
#   == ("2019-02-20", "06:30")
get_departure = itemgetter("DEPARTURE DATE", "DEPARTURE TIME")

Теперь просто используйте эту функцию в качестве ключевой функции для определения «размера» dict при вычислении наибольшего dict.

with open('livedepartures/alilauro.json', encoding='utf-8') as data_file:
    alilauro_data = json.loads(data_file.read())

newest_alilauro = max(alilauro_data, key=get_departure)

Это даст вам dict с последним отъездом.Если все, что вам нужно, - это сам вылет, вы можете передать список кортежей в max вместо использования key.Вместо вычисления наибольшего dict мы вычисляем самый большой кортеж.

 newest_departure = max(map(get_departure, alilauro_data))

Каждая дата и время уже отформатированы так, что их лексикографическое упорядочение совпадает с их хронологическим упорядочением.

0 голосов
/ 18 февраля 2019

Не совсем.Преимущество формата ISO заключается в том, что вы можете выполнять сортировку строк (при условии, что у вас есть даты или метки времени UTC - с часовым поясом "Z").

newest_alilauro_trip = max(
  alilauro_data,
  key=lambda item: item["DEPARTURE DATE"] + item["DEPARTURE TIME"]
)
0 голосов
/ 18 февраля 2019

Pandas отлично подходит для любого типа данных, как это

import pandas as pd
data = pd.read_json("sample.json")
data['timestamp'] = pd.to_datetime(data["DEPARTURE DATE"] + ' ' + data["DEPARTURE TIME"])
print(data['timestamp'].max())

даст вам

2019-02-20 06:30:00
0 голосов
/ 18 февраля 2019

Если вам разрешено использовать внешние библиотеки, я бы посмотрел на Maya .С помощью этой библиотеки вы можете легко проанализировать все даты и время отправления в вашем файле JSON и найти тот, который имеет наименьшее расстояние до maya.now(), предполагая, что это то, что вам нужно, с «новейшими датой и временем отправления».

К сожалению, если вам не гарантирован какой-либо порядок в исходном файле JSON, единственный способ, который я вижу, - это проанализировать их все и проверить, какой из них самый новый.По крайней мере с Maya будет легче иметь дело с datetime, хотя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...