как отфильтровать вложенный словарь из списка словаря на основе диапазона дат

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

Мне нужно отфильтровать вложенный словарь из списка словаря на основе диапазона дат

вот мой список:

 [{'5-jan-2019': '34'}, {'10-jan-2019': '34'}, {'21-jan-2019': '12'}, {'25-jan-2019': '34'} , {'5-feb-2019': '34'}]
  

Мне нужно отфильтровать весь вложенный словарь в диапазоне дат, например

 from_date-'5-jan-2019' and  to_date-'25-jan-2019'
  

и добавьте его в новый словарь

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

 {
    '5-jan-2019': '34',
    '10-jan-2019': '34',
    '21-jan-2019': '12',
    '25-jan-2019': '34'
}
  

Ответ №1:

Вы хотите, чтобы datetime.strptime преобразовывал строки в объекты datetime, которые затем можно сравнивать друг с другом.

 from datetime import datetime

lst = [
    {'5-jan-2019': '34'},
    {'10-jan-2019': '34'},
    {'21-jan-2019': '12'},
    {'25-jan-2019': '34'},
    {'5-feb-2019': '34'},
    ]

dt_from_str = lambda dt: datetime.strptime(dt, '%d-%b-%Y')

start_date = dt_from_str('5-jan-2019')
end_date = dt_from_str('25-jan-2019')

new_dict = {}
for sub_dict in lst:
    for key, val in sub_dict.items():
        if start_date <= dt_from_str(key) <= end_date:
            new_dict[key] = val

print(new_dict)
  

вывод:

 {
    '5-jan-2019': '34',
    '10-jan-2019': '34',
    '21-jan-2019': '12',
    '25-jan-2019': '34',
}
  

Ответ №2:

Вы можете использовать datetime модуль для использования встроенных методов сравнения ( __lt__ и т.д.) datatime.datetime объекта:

 import datetime
data = [{'5-jan-2019': '34'}, {'10-jan-2019': '34'}, {'21-jan-2019': '12'}, {'25-jan-2019': '34'} , {'5-feb-2019': '34'}]
start, end = '5-jan-2019', '25-jan-2019'
  

 def d_form(d):
   months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
   _d, _m, _y = d.split('-')
   return datetime.datetime(int(_y), months.index(_m) 1, int(_d))

start, end = d_form(start), d_form(end)
final_result = [i for i in data if start <= d_form(list(i.keys())[0]) <= end]
  

Вывод:

 [{'5-jan-2019': '34'}, 
 {'10-jan-2019': '34'}, 
 {'21-jan-2019': '12'}, 
 {'25-jan-2019': '34'}]