Source code for fusetools.date_tools

"""
Functions for interacting with Python date objects.

"""

import math
from datetime import datetime, timedelta


[docs]def get_last_dow(dow, ref_date=False): """ Get the last date for a given day of the week (ex: Sunday, Monday) :param dow: Day of week to pull date for. :param ref_date: Date to provide a reference for (optional). :return: Last date for a given day of the week. """ dd = { 'monday': 7, 'tuesday': 1, 'wednesday': 2, 'thursday': 3, 'friday': 4, 'saturday': 5, 'sunday': 6 } if not ref_date: d = datetime.today() else: d = datetime.strptime(ref_date, "%Y-%m-%d") # backtrack to last sunday offset = (d.weekday() - dd.get("sunday")) % 7 last_sunday = d - timedelta(days=offset) offset = (last_sunday.weekday() - dd.get(dow)) % 7 date = str(last_sunday - timedelta(days=offset))[:10] return date
[docs]def get_rptg_qtr(ref_date=False): """ Get the reporting year/quarter combination for a given date. :param ref_date: Date to provide a reference for (optional). :return: Reporting year/quarter combination. """ if ref_date: date = datetime.strptime(ref_date, '%Y-%m-%d') year = str(date.year) qtr = str(math.ceil(date.month / 3)).zfill(2) else: year = str(datetime.now().year) qtr = str(math.ceil(datetime.now().month / 3)).zfill(2) if qtr == "01": qtr = "04" year = str(int(year) - 1) date = year + qtr return date
[docs]def get_rptg_mon(ref_date=False): """ Get the reporting year/month combination for a given date. :param ref_date: Date to provide a reference for (optional). :return: Reporting year/month combination. """ if ref_date: date = datetime.strptime(ref_date, '%Y-%m-%d') else: date = int(datetime.now().strftime('%Y%m')) if int(str(date)[-2:]) == 1: date = str(int(str(date)[:4]) - 1) + \ "12" else: date = str(int(str(date)[:4])) + str(int(str(date)[-2:]) - 1).zfill(2) return date
[docs]def get_rptg_yr(ref_date=False): """ Get the reporting year for a given date. :param ref_date: Date to provide a reference for (optional). :return: Reporting year for a given date. """ if ref_date: date = int(datetime.strptime(ref_date, '%Y')) else: date = int(datetime.now().strftime('%Y')) if get_rptg_week()[4:6] == 52: date = date - 1 return date
[docs]def get_rptg_week(ref_date=False): """ Get the reporting year/week combination for a given date. :param ref_date: Date to provide a reference for (optional). :return: Reporting year/week combination for a given date. """ if ref_date: date = datetime.strptime(ref_date, '%Y-%m-%d') # if ref date, find next sunday rel_sunday = date + timedelta((6 - date.weekday()) % 7) # rel_sunday.strftime("%Y-%m-%d") else: date = datetime.now() # if today, find last sunday offset = (date.weekday() - 6) % 7 rel_sunday = date - timedelta(days=offset) rpt_year = rel_sunday.strftime("%Y") rpt_month = rel_sunday.strftime("%m") rpt_week = rel_sunday.strftime("%V") if rpt_month == '12' and rpt_week == '01': rpt_year = str(int(rpt_year) + 1) return rpt_year + rpt_week