Last active
November 24, 2015 16:52
-
-
Save Visgean/6e987173447a90d2c9e3 to your computer and use it in GitHub Desktop.
weeks/months range
This file contains 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 datetime import timedelta, datetime | |
from dateutil.relativedelta import relativedelta | |
def get_months_range(base_date=None, months_back=0): | |
""" | |
Returns calendar month for given date | |
Args: | |
base_date: date to be used, date.today is default | |
months_back: how many months to looks back | |
Returns: | |
tuple: (start, end) | |
""" | |
months_ago = months_back % 12 | |
years_ago = months_back / 12 | |
if base_date is None: | |
base_date = datetime.today() | |
date_adjusted = datetime( | |
year=base_date.year, | |
month=base_date.month, | |
day=1, | |
hour=0, | |
minute=0) | |
start_date = date_adjusted - relativedelta(months=months_ago, years=years_ago) | |
end_date = start_date + relativedelta(months=1, days=-1, | |
hours=23, minutes=59) | |
assert (end_date - start_date).days in (27, 28, 29, 30, 31) | |
return start_date, end_date | |
for i in range(10): | |
print i, get_months_range(months_back=i) |
This file contains 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 datetime import timedelta, datetime | |
def get_week_range(base_date=None, weeks_back=0): | |
""" | |
Returns calendar week for given date | |
Args: | |
base_date: date to be used, date.today is default | |
weeks_back: how many weeks to looks back | |
Returns: | |
tuple: (start, end) | |
""" | |
if base_date is None: | |
base_date = datetime.today() | |
date_adjusted = datetime( | |
year=base_date.year, | |
month=base_date.month, | |
day=base_date.day, | |
hour=0, | |
minute=0) | |
start_date = date_adjusted - timedelta(days=base_date.isoweekday() - 1, | |
weeks=weeks_back) | |
end_date = start_date + timedelta(days=6, hours=23, minutes=59) | |
assert start_date.isoweekday() == 1 | |
assert end_date.isoweekday() == 7 | |
return start_date, end_date | |
for i in range(105132): print i, get_week_range(weeks_back=i) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment