Нахождение ближайшей даты к сегодняшней дате из словаря - PullRequest
2 голосов
/ 08 октября 2019

Я хочу найти количество дней между сегодняшней датой и следующей датой в словаре дат. Во-первых, я пытаюсь найти ближайшую дату в словаре к текущей дате.

current_date = datetime.today()
date_schedule = {
    "1": "2019-7-29",
    "2": "2019-8-27",
    "3": "2019-9-27",
    "4": "2019-10-28",
    "5": "2019-11-27",
    "6": "2019-12-27",
    "7": "2020-1-27",
    "8": "2020-2-27",
    "9": "2020-3-27",
    "10": "2020-4-27",
    "11": "2020-5-27",
    "12": "2020-6-29",
}

def days_till_payment(date_schedule, current_date):
    days_left = min(date_schedule, key=lambda x: abs(x - current_date))
    return days_left

Однако, когда я пытаюсь выполнить это, я получаю следующую ошибку:

TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'

Я был бы очень признателен, кто-то, пожалуйста, объясните мне, как я могу обойти это и выяснить, сколько дней между текущей датой и следующей ближайшей датой из словаря.

РЕДАКТИРОВАТЬ: Эта функция будетЛучше, если он вернет СЛЕДУЮЩУЮ дату UPCOMING, а не только ближайшую дату (которая включает в себя уже ушедшие даты). Я хотел бы вывести следующую предстоящую дату и сколько дней осталось до этой даты с сегодняшнего дня.

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Вам необходимо преобразовать str в datetime объект. Затем

1.Найдите указатель из date_schedules, где указатель> = текущая дата

2.Найдите разницу в днях между указателем - текущая дата

from datetime import datetime

date_schedule = {
    "1": "2019-7-29",
    "2": "2019-8-27",
    "3": "2019-9-27",
    "4": "2019-10-28",
    "5": "2019-11-27",
    "6": "2019-12-27",
    "7": "2020-1-27",
    "8": "2020-2-27",
    "9": "2020-3-27",
    "10": "2020-4-27",
    "11": "2020-5-27",
    "12": "2020-6-29",
}

def keyfunc(date):
    return (date - datetime.today()).days

def days_till_payment(date_schedule, today):
    dates = [datetime.strptime(v, '%Y-%m-%d') for v in date_schedule.values()]
    search_dates = [date for date in dates if date >= today]
    date = min(search_dates, key=keyfunc)
    return (date - today).days, date.strftime('%Y-%m-%d')


>>> days, date = days_till_payment(date_schedule, datetime.today())
>>> days
19
>>> date
'2019-10-28'
1 голос
/ 08 октября 2019

Используя map, filter, min преимущества этого, дата конвертируется только один раз, мы перебираем список дат только один раз:

from datetime import datetime

date_schedule = {
    "1": "2019-7-29",
    "2": "2019-8-27",
    "3": "2019-9-27",
    "4": "2019-10-28",
    "5": "2019-11-27",
    "6": "2019-12-27",
    "7": "2020-1-27",
    "8": "2020-2-27",
    "9": "2020-3-27",
    "10": "2020-4-27",
    "11": "2020-5-27",
    "12": "2020-6-29",
}


def days_till_payment(date_schedule, current_date):
    converted_data = map(lambda v: datetime.strptime(v, '%Y-%m-%d'),  date_schedule.values() )
    filtered_data = filter(lambda v: v >= current_date, converted_data)
    min_date = min(filtered_data, key=lambda v: v - current_date)
    return min_date.strftime('%Y-%m-%d')


current_date = datetime.today()
print(days_till_payment(date_schedule, current_date)) # 2019-10-28
0 голосов
/ 08 октября 2019

Вопрос : Я хотел бы вывести следующую предстоящую дату и сколько дней осталось до этой даты с сегодняшнего дня.


Примечание : элементы dict должны быть в упорядоченной последовательности. Используйте collections.OrderedDict вместо!


def strptime(datestr):
    return datetime.strptime(datestr, '%Y-%m-%d')

def days_till_payment(date_schedule, current_date):
    for k, v in date_schedule.items():
        v = strptime(v)
        if v > current_date:
            return v,  (v - current_date).days

print(days_till_payment(date_schedule, datetime.now()))

>>> (datetime.datetime(2019, 10, 28, 0, 0), 19)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...