@MonsterAndrew

Как сделать сортировку элементов по дате на Python?

Есть массив с элементами типа dict.
lst = [{"date": "2017-09-03"}, {"date": "2017-09-02"}, {"date": "2017-09-01"}]

Только длина массива около 20. Надо сделать так, чтобы оставались элементы только с сегодняшней датой и +- 4 дня. Т.е. например сегодня 5 число, надо чтобы остались только 9-1.
  • Вопрос задан
  • 2328 просмотров
Решения вопроса 1
@MonsterAndrew Автор вопроса
def filtr(mass, days_ago, days_future):
    delta1 = timedelta(days=days_ago)
    delta2 = timedelta(days=days_future)
    delta3 = timedelta(days=1)
    new = []
    today = datetime.today()
    for el in mass:
        to_date = datetime.strptime(el['date'], '%Y-%m-%d')
        if to_date >= today and (to_date - today) <= delta2:
            new.append(el)
        elif to_date <= today and (today - to_date) <= delta1+delta3:
            new.append(el)
    return new
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
> Надо сделать так, чтобы оставались элементы только с сегодняшней датой и +- 4 дня.
Это фильтр тогда. Например так:

import datetime
lst = [{'date': '2017-09-03'}, {'date': '2017-09-02'}, {'date': '2017-09-01'}, {'date': '2017-09-28'}, {'date': '2017-10-02'}]

now = datetime.datetime.now()

lst2 = filter(lambda x: datetime.datetime.strptime(x['date'], '%Y-%m-%d')>now-datetime.timedelta(days=4) and datetime.datetime.strptime(x['date'], '%Y-%m-%d')<now+datetime.timedelta(days=4), lst)


>>> lst2
[{'date': '2017-09-28'}, {'date': '2017-10-02'}]


Остаток массива
lst_sorted = filter(lambda y: y not in lst2, sorted(lst, key=lambda x: datetime.datetime.strptime(x['date'], '%Y-%m-%d')))

Результат:
>>> lst2 + lst_sorted
[{'date': '2017-09-28'}, {'date': '2017-10-02'}, {'date': '2017-09-01'}, {'date': '2017-09-02'}, {'date': '2017-09-03'}]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 15:28
10000 руб./за проект
29 мар. 2024, в 15:11
50000 руб./за проект
29 мар. 2024, в 15:06
50000 руб./за проект