Source code for businessdate.conventions

# -*- coding: utf-8 -*-

# businessdate
# ------------
# Python library for generating business dates for fast date operations
# and rich functionality.
#
# Author:   sonntagsgesicht, based on a fork of Deutsche Postbank [pbrisk]
# Version:  0.5, copyright Wednesday, 18 September 2019
# Website:  https://github.com/sonntagsgesicht/businessdate
# License:  Apache License 2.0 (see LICENSE file)


from calendar import WEDNESDAY, FRIDAY
from datetime import date, timedelta
from .ymd import days_in_month, end_of_quarter_month

ONE_DAY = timedelta(1)


[docs]def is_business_day(business_date, holidays=list()): """ method to check if a date falls neither on weekend nor is in holidays. """ if business_date.weekday() > FRIDAY: return False if business_date in holidays: return False if hasattr(business_date, 'to_date') and \ business_date.to_date() in holidays: return False return True
[docs]def adjust_no(business_date, holidays=()): """ does no adjustment. """ return business_date
[docs]def adjust_previous(business_date, holidays=()): """ adjusts to Business Day Convention "Preceding". """ while not is_business_day(business_date, holidays): business_date -= ONE_DAY return business_date
[docs]def adjust_follow(business_date, holidays=()): """ adjusts to Business Day Convention "Following". """ while not is_business_day(business_date, holidays): business_date += ONE_DAY return business_date
[docs]def adjust_mod_follow(business_date, holidays=()): """ adjusts to Business Day Convention "Modified [Following]". """ month = business_date.month new = adjust_follow(business_date, holidays) if month != new.month: new = adjust_previous(business_date, holidays) business_date = new return business_date
[docs]def adjust_mod_previous(business_date, holidays=()): """ adjusts to Business Day Convention "Modified Preceding". """ month = business_date.month new = adjust_previous(business_date, holidays) if month != new.month: new = adjust_follow(business_date, holidays) business_date = new return business_date
[docs]def adjust_start_of_month(business_date, holidays=()): """ adjusts to Business Day Convention "Start of month", i.e. first business day. """ business_date = date(business_date.year, business_date.month, 1) business_date = adjust_follow(business_date, holidays) return business_date
[docs]def adjust_end_of_month(business_date, holidays=()): """ adjusts to Business Day Convention "End of month", i.e. last business day. """ y, m, d = business_date.year, business_date.month, business_date.day business_date = date(y, m, days_in_month(y, m)) business_date = adjust_previous(business_date, holidays) return business_date
[docs]def adjust_imm(business_date, holidays=()): """ adjusts to Business Day Convention of "International Monetary Market". """ business_date = date(business_date.year, end_of_quarter_month(business_date.month), 15) while business_date.weekday() == WEDNESDAY: business_date += ONE_DAY return business_date
[docs]def adjust_cds_imm(business_date, holidays=()): """ adjusts to Business Day Convention "Single Name CDS". """ business_date = date(business_date.year, end_of_quarter_month(business_date.month), 20) return business_date