Поиск действительной даты - PullRequest
1 голос
/ 13 июля 2020

У меня есть список недействительных дат (это может быть праздничный c праздник в определенной области / стране или любая другая недействительная дата, и это может быть длинный список, включающий несколько лет):

Holiday = ['2020-01-01','2020-01-09','2020-01-10']

Я хочу создать функцию поиска, при которой при заданной дате функция будет искать предыдущую действительную дату (исключая выходные и праздничные дни). Например, текущая дата - «2020-01-13», тогда действительной датой будет «2020-01-08», потому что «2020-01-09» и «2020-01-10» находятся в праздничных днях, а «2020». -01-11 'и' 2020-01-12 '- выходные.

Моя функция:


from pandas.tseries.offsets import BDay

def the_date(today):

    today = datetime.strptime(today,'%Y-%m-'%d').date()
    the_date = today - BDay(1)
    the_date = datetime.strftime(the_date,'%Y-%m-%d')

    if the_date in Holiday:
       the_new_date = (datetime.strptime(Holiday[Holiday.index(the_date)],'%Y-%m-%d') - BDay(1)).date()
       the_new_date = datetime.strftime(the_new_date,'%Y-%m-%d')
    
    else:
       the_new_date = the_date
   
    return the_new_date

Когда я использую эту функцию:

today = '2020-01-13'


the_new_date = the_date(today)

обязательно the_new_date - это '2020-01-09', потому что моя функция не может идентифицировать два последовательных недействительных дня (праздник) - есть ли способ заставить мою функцию идентифицировать два последовательных праздника, чтобы мой результат (the_new_date) был ' 2020-01-08 '? Спасибо.

1 Ответ

1 голос
/ 13 июля 2020

Используйте .weekday() из datetime, чтобы написать рекурсивную функцию the_date. Кроме того, мы расширили программу, используя модуль праздников (https://pypi.org/project/holidays/), чтобы динамически получать праздники для данной страны (здесь я выбрал Германию, поскольку это ваша страна, указанная в списке), поэтому вам больше не нужно жестко кодировать свой Holiday список (если вы не указали c праздничные дни компании или аналогичные):

import holidays

from datetime import datetime
from pandas.tseries.offsets import BDay

Holiday = ['2020-01-01', '2020-01-09', '2020-01-10']
Holiday = [datetime.strptime(holiday, '%Y-%m-%d').date() for holiday in Holiday]
ge_holidays = holidays.Germany()


def the_date(day):
    if (day - BDay(1)).date().weekday() in (5, 6):
        if (day - BDay(2)).date().weekday() in (5, 6):
            new_date = (day - BDay(3)).date()
        else:
            new_date = (day - BDay(2)).date()
    else:
        new_date = (day - BDay(1)).date()
    if new_date in Holiday or new_date in ge_holidays:
        return the_date(new_date)
    return new_date


# Test:
print(the_date(datetime.today()), '\n')

for day in Holiday:
    print(the_date(day))

Возврат:

2020-07-10 

2019-12-31
2020-01-08
2020-01-08
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...