Найти ближайшую минимальную метку времени (из массива словарей) к данной метке времени - PullRequest
0 голосов
/ 29 марта 2019

Имея следующий список словарей, который включает отметку времени (в строковом значении) и значение:

    my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1},
                  {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}, 
                  {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]

Я хочу получить заданное значение отметки времени (в строковом формате), найти (ближайшийминимальное значениеОбъяснить это немного беспорядочно, поэтому лучше увидеть это на примере:

  • Если значение данного_время 2009-11-10T23:00:019Z, я хочу вернуть: {'timestamp': '2009-11-10T23:00:05Z', 'value': 2} (а не {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}).
  • Если значение данного_временной отметки равно 2009-11-10T23:00:04Z, я хочу вернуть: {'timestamp': '2009-11-10T23:00:01Z', 'value': 1} (а не {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}).
  • Если значение указанного_временной отметки равно 2009-11-10T23:00:05Z, я хочу вернуть: {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}.

Следующий код получает ближайшее значение, но я не знаю, как изменить его, чтобы получить минимальное значение.

import datetime
my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}, {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}, {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]
myNumber = "2009-11-10T23:00:19Z"
myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
res = min(my_example, key=lambda x:abs(datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ") - myNumber))
print(res)

Заранее спасибо.

1 Ответ

0 голосов
/ 29 марта 2019

Вы можете преобразовать в кортежи, заменить будущие даты на бесконечность, а затем взять минимум.

Ваши данные:

import datetime
my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}, {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}, {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]
myNumber = "2009-11-10T23:00:19Z"
myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
res = min(my_example, key=lambda x:abs(datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ") - myNumber))
print(res)

Редактировать: Я изменил его с панд на datetime и добавил в кортежи.Здесь мы берем день и второй кортеж из списка.Мы делаем некоторые хитрые манипуляции здесь, чтобы изменить все, что в будущем, на бесконечность, поэтому мы пропускаем это.И тогда мы просто берем минимум списка кортежей, который должен возвращать ближайшее время, которого нет в будущем.

def get_min_time(myNumber, list_):
    myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
    times = [(myNumber - datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ")) for x in list_]
    tups = [(x.days, x.seconds) for x in times]
    tups = [(float("inf"), float("inf")) if time < (0, 0) else time for time in tups]
    return list_[tups.index(min(tups))]



get_min_time("2009-11-10T23:00:19Z", my_example)
{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}

get_min_time("2009-11-10T23:00:04Z", my_example)
{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}

get_min_time("2009-11-10T23:00:05Z", my_example)
{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}

Если вам нужно запустить это для всего списка вещей, просто используйте понимание списка:

[get_min_time(x, list_) for x in my_Numbers]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...