Python сортировать и выбирать более старые значения на основе их даты и времени - PullRequest
0 голосов
/ 24 июня 2019

Я работаю над поиском старых дублированных запущенных экземпляров в моей учетной записи AWS.

Пока у меня есть следующие JSON-данные, в которых перечислены дубликаты экземпляров.

[
    {
        "InstanceName": "example-instance-0",
        "InstanceId": "i-0966108",
        "InstanceLaunchTime": "2019-06-20 19:10:50+00:00"
    },
    {
        "InstanceName": "example-instance-1",
        "InstanceId": "i-0d83ecc",
        "InstanceLaunchTime": "2019-06-20 22:27:10+00:00"
    },
    {
        "InstanceName": "example-instance-0",
        "InstanceId": "i-0268215",
        "InstanceLaunchTime": "2019-04-19 14:25:11+00:00"
    },
    {
        "InstanceName": "example-instance-1",
        "InstanceId": "i-0a9b614",
        "InstanceLaunchTime": "2019-06-19 21:57:50+00:00"
    }
]

Отсюда я хотел исключить последний экземпляр по дате и времени и распечатать все остальные экземпляры.

Я могу сделать это, используя pandas dataframe. Но не в состоянии разобраться без панд. Есть ли способ сделать это?

Вывод, который я ищу:

example-instance-0,i-0268215,2019-04-19,14:25:11
example-instance-1,i-0a9b614,2019-06-19,21:57:50

Я прошу прощения, я все еще новичок в Python и ищу помощи. Спасибо.

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Использование itertools.groupby

Пример:

from itertools import groupby

data = [{'InstanceId': 'i-0966108', 'InstanceName': 'example-instance-0', 'InstanceLaunchTime': '2019-06-20 19:10:50+00:00'}, {'InstanceId': 'i-0d83ecc', 'InstanceName': 'example-instance-1', 'InstanceLaunchTime': '2019-06-20 22:27:10+00:00'}, {'InstanceId': 'i-0268215', 'InstanceName': 'example-instance-0', 'InstanceLaunchTime': '2019-04-19 14:25:11+00:00'}, {'InstanceId': 'i-0a9b614', 'InstanceName': 'example-instance-1', 'InstanceLaunchTime': '2019-06-19 21:57:50+00:00'}]
result = []
for _, v in groupby(sorted(data, key=lambda x: (x["InstanceName"],x["InstanceLaunchTime"])), lambda x: x["InstanceName"]):
    result.extend(list(v)[-1:])  #Exclude latest item
pprint(result)

Выход:

[{'InstanceId': 'i-0268215',
  'InstanceLaunchTime': '2019-04-19 14:25:11+00:00',
  'InstanceName': 'example-instance-0'},
 {'InstanceId': 'i-0a9b614',
  'InstanceLaunchTime': '2019-06-19 21:57:50+00:00',
  'InstanceName': 'example-instance-1'}]
1 голос
/ 24 июня 2019

Вот код, который должен помочь, заметьте, я не отформатировал вывод как строку, которую вы смотрите, просматривая список вывода, который вы можете отформатировать и получить нужным образом

inputs = [
{
    "InstanceName": "example-instance-0",
    "InstanceId": "i-0966108",
    "InstanceLaunchTime": "2019-06-20 19:10:50+00:00"
},
{
    "InstanceName": "example-instance-1",
    "InstanceId": "i-0d83ecc",
    "InstanceLaunchTime": "2019-06-20 22:27:10+00:00"
},
{
    "InstanceName": "example-instance-0",
    "InstanceId": "i-0268215",
    "InstanceLaunchTime": "2019-04-19 14:25:11+00:00"
},
{
    "InstanceName": "example-instance-1",
    "InstanceId": "i-0a9b614",
    "InstanceLaunchTime": "2019-06-19 21:57:50+00:00"
}
]

outputs = []
keys = []
for ip in reversed(inputs) :
    if ip["InstanceName"] not in keys :
        outputs.append([ip["InstanceName"], ip["InstanceId"],     ip["InstanceLaunchTime"]])
        keys.append(ip["InstanceName"])
print (outputs)

Вы получите вывод

>>> [['example-instance-1', 'i-0a9b614', '2019-06-19 21:57:50+00:00'], ['example-instance-0', 'i-0268215', '2019-04-19 14:25:11+00:00']]
0 голосов
/ 24 июня 2019

сначала отсортируйте на основе timestamps, а затем удалите дубликаты. Попробуйте приведенный ниже код.

lst1=[
    {
        "InstanceName": "example-instance-0",
        "InstanceId": "i-0966108",
        "InstanceLaunchTime": "2019-06-20 19:10:50+00:00"
    },
    {
        "InstanceName": "example-instance-1",
        "InstanceId": "i-0d83ecc",
        "InstanceLaunchTime": "2019-06-20 22:27:10+00:00"
    },
    {
        "InstanceName": "example-instance-0",
        "InstanceId": "i-0268215",
        "InstanceLaunchTime": "2019-04-19 14:25:11+00:00"
    },
    {
        "InstanceName": "example-instance-1",
        "InstanceId": "i-0a9b614",
        "InstanceLaunchTime": "2019-06-19 21:57:50+00:00"
    }
]
#Sort here based on timestamps using lamda function
lst1=sorted(lst1, key = lambda i: i['InstanceLaunchTime'].split(' ')[1])
res_list = []

seen = set()
res_list = []
for d in lst1:
    if d['InstanceName'] not in seen:
        seen.add(d['InstanceName']) 
        res_list.append(d)
print(res_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...