Last active
November 13, 2023 20:21
-
-
Save valdergallo/8ea8c42fa68b9a6e2555a9328691ce76 to your computer and use it in GitHub Desktop.
Calculate the next valid date
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from dateutil.relativedelta import relativedelta | |
from datetime import datetime | |
WEEKLY = relativedelta(weeks=1) | |
BIWEEKLY = relativedelta(weeks=2) | |
MONTHLY = relativedelta(months=1) | |
YEARLY = relativedelta(years=1) | |
def get_next_date( | |
start_date: datetime, | |
frequency: relativedelta, | |
end_date: datetime = None, | |
limit: int = 1, | |
): | |
"""Calculate the next date calculating the end dates of month and | |
leap year | |
Args: | |
start_date (datetime): Start date | |
frequency (relativedelta): Frequency configuration | |
end_date (datetime, optional): End date to return. Defaults to None. | |
limit (int, optional): Limit dates to return. Defaults to 1. | |
Yields: | |
datetime: Return a datetime | |
""" | |
if limit: | |
for count in range(1, limit + 1): | |
next_date = start_date + (count * frequency) | |
if end_date and next_date > end_date: | |
break | |
yield next_date | |
elif end_date and not limit: | |
next_date = start_date | |
count = 1 | |
while next_date < end_date: | |
next_date = start_date + (count * frequency) | |
count += 1 | |
yield next_date |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment