Skip to content

Instantly share code, notes, and snippets.

@Visgean
Last active November 24, 2015 16:52
Show Gist options
  • Save Visgean/6e987173447a90d2c9e3 to your computer and use it in GitHub Desktop.
Save Visgean/6e987173447a90d2c9e3 to your computer and use it in GitHub Desktop.
weeks/months range
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)
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