Получить недавнее событие на основе региона и eventTypeCode - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующие json данные, как мне получить последние записи на основе region и eventTypeCode с последним событием путем сортировки startTime in python ?. Необходимо игнорировать дубликаты для eventTypeCode . Можно ли как-то сравнить это startTime в python, выяснить, какая запись является последней, и вернуть ТОЛЬКО эту запись?

Пример данных:

   "ResponseMetadata": {
      "HTTPHeaders": {
         "content-length": "1478",
         "content-type": "application/x-amz-json-1.1",
         "date": "Mon, 27 Jan 2020 21:24:47 GMT",
         "x-amzn-requestid": "a84471fc-8bde-4404-854e-c1656884cac5"
      },
      "HTTPStatusCode": 200,
      "RequestId": "a84471fc-8bde-4404-854e-c1656884cac5",
      "RetryAttempts": 0
   },
   "events": [
      {
         "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
         "startTime": "2020-01-15 11:50:00-06:00",
         "region": "us-east-1"
      },
      {
         "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
         "startTime": "2019-11-26 02:59:00-06:00",
         "region": "us-east-1"
      },
      {
         "eventTypeCode": "AWS_TRUSTEDADVISOR_OPERATIONAL_NOTIFICATION",
         "startTime": "2020-01-27 12:36:00-06:00",
         "region": "us-east-1"
      },
      {
         "eventTypeCode": "AWS_TRUSTEDADVISOR_OPERATIONAL_NOTIFICATION",
         "startTime": "2019-11-18 16:04:00-06:00",
         "region": "us-east-1"
      },
      {
         "eventTypeCode": "AWS_MARKETPLACE_OPERATIONAL_NOTIFICATION",
         "startTime": "2019-11-11 11:30:00-06:00",
         "region": "us-east-1"
      },
      {
         "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
         "startTime": "2020-01-10 11:55:00-06:00",
         "region": "us-west-1"
      },
      {
         "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
         "startTime": "2019-11-13 02:15:00-06:00",
         "region": "us-west-1"
      },
   ]
}

Ожидаемый результат:

   "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
   "startTime": "2020-01-15 11:50:00-06:00",
   "region": "us-east-1"
},
{
   "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
   "startTime": "2020-01-10 11:55:00-06:00",
   "region": "us-west-1"
}
{
   "eventTypeCode": "AWS_MARKETPLACE_OPERATIONAL_NOTIFICATION",
   "startTime": "2019-11-11 11:30:00-06:00",
   "region": "us-east-1"
},
{
   "eventTypeCode": "AWS_TRUSTEDADVISOR_OPERATIONAL_NOTIFICATION",
   "startTime": "2019-11-18 16:04:00-06:00",
   "region": "us-east-1"
}

1 Ответ

1 голос
/ 28 января 2020
import datetime as dt
from dateutil.parser import parse
import json

def events_equal(event1, event2):
    return event1["eventTypeCode"] == event2["eventTypeCode"] and event1["region"] == event2["region"]

json_data = ### Insert your json data string here ###


parsed_json_data = json.loads(json_data)
filtered_events = []

for parsed_event in parsed_json_data["events"]:
    already_present = False
    ## for every event, check if we've already added it to the filtered list
    for filtered_event_index in range(len(filtered_events)):
        if events_equal(parsed_event, filtered_events[filtered_event_index]):
            already_present = True
            ## Convert startTime strings to datetime object for comparison
            parsed_event_date = parse(parsed_event["startTime"])
            filtered_event_date = parse(filtered_events[filtered_event_index]["startTime"])
            ## Use parse if on an older version of python, otherwise
            ## strptime can handle the conversion
            ## parsed_event_date = dt.datetime.strptime(parsed_event["startTime"], '%Y-%m-%d %H:%M:%S%z')
            ## filtered_event_date = dt.datetime.strptime(filtered_events[filtered_event_index]["startTime"], '%Y-%m-%d %H:%M:%S%z')
            if parsed_event_date > filtered_event_date:
                ## if parsed event date is newer, replace the one already present
                filtered_events[filtered_event_index] = parsed_event
    if not already_present:
        filtered_events.append(parsed_event)

## build the new json object
filtered_events = {"events": filtered_events}
print(json.dumps(filtered_events, indent=4))

Вывод:

{
    "events": [
        {
            "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
            "startTime": "2020-01-15 11:50:00-06:00",
            "region": "us-east-1"
        },
        {
            "eventTypeCode": "AWS_TRUSTEDADVISOR_OPERATIONAL_NOTIFICATION",
            "startTime": "2020-01-27 12:36:00-06:00",
            "region": "us-east-1"
        },
        {
            "eventTypeCode": "AWS_MARKETPLACE_OPERATIONAL_NOTIFICATION",
            "startTime": "2019-11-11 11:30:00-06:00",
            "region": "us-east-1"
        },
        {
            "eventTypeCode": "AWS_RDS_SECURITY_NOTIFICATION",
            "startTime": "2020-01-10 11:55:00-06:00",
            "region": "us-west-1"
        }
    ]
}

Это будет работать только начиная с python 3.7, более ранние версии strptime будут только анализировать смещение UT C в виде -0600, а не -06:00.

Редактировать: я заменил вызовы strptime анализатором dateutil, который будет работать с более ранними версиями python.

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