def test_semester(self): dates = [ datetime.date(2019, 1, 1), datetime.date(2019, 6, 30), datetime.date(2019, 7, 1), datetime.date(2019, 12, 31), ] self.assertEqual([utils.semester(date) for date in dates], [1, 1, 2, 2])
def eos(self, date: datetime.date) -> datetime.date: """ Returns the last open date of the semester Parameters ---------- date : datetime.date the date from which to compute the end of semester Returns ------- datetime.date """ for i in range(self.index(date), len(self)): if (utils.semester(self.__dates__[i]) == utils.semester(date) and self.__dates__[i].year == date.year): continue return self.__dates__[i - 1] return self.__dates__[i]
def sos(self, date: datetime.date) -> datetime.date: """ Returns the first open day of the semester given the date Parameters ---------- date : datetime.date the date from which to compute the start of semester Returns ------- datetime.date """ for i in range(self.index(date), -1, -1): if (utils.semester(self.__dates__[i]) == utils.semester(date) and self.__dates__[i].year == date.year): continue return self.__dates__[i + 1] return self.__dates__[i]
def filter( self, func=None, *, year: int = None, semester: int = None, quarter: int = None, month: int = None, week: int = None, weekday: str = None, ): """ Filters and returns a new calendar from this calendar based on a criteria. Allowed criteria are: - either a filtering function (lambda) - one or several filtering frequencies as named arguments Parameters ---------- func : function, optional a filtering function (receives each date as argument) year : int, optional pass a value to filter dates of the given year only semester : int, optional (1 or 2) pass a value to filter dates of the given semester only quarter : int, optional (1, 2, 3, or 4) pass a value to filter dates of the given quarter only month : int, optional (1 through 12) pass a value to filter dates of the given month only week : int, optional (1 through 53) pass a value to filter dates of the given week number only weekday : int, optional (0 through 6) pass a value to filter dates of the given weekday only Monday = 0, Tuesday = 1... Sunday = 6 Returns ------- Calendar Example ------- Filter dates from 3Q 2020 >>> calendar = Calendar(dates) #assume dates is a list of dates >>> calendar.filter(year=2020, quarter=3) Filter Mondays >>> calendar = Calendar(dates) >>> calendar.filter(lambda date: date.weekday() == 0) """ if func is not None: if not callable(func): raise ValueError( "Filter accepts either a function, one or several named arguments" ) return Calendar([date for date in self.__dates__ if func(date)]) if all([ arg is None for arg in [year, semester, quarter, month, week, weekday] ]): raise ValueError( "You need to provide one of year, semester, quarter, month, week, weekday" ) dates = list(self.__dates__) if year is not None: dates = list(filter(lambda date: date.year == year, dates)) if semester is not None: dates = list( filter(lambda date: utils.semester(date) == semester, dates)) if quarter is not None: dates = list( filter(lambda date: utils.quarter(date) == quarter, dates)) if month is not None: dates = list(filter(lambda date: date.month == month, dates)) if week is not None: dates = list( filter(lambda date: date.isocalendar()[1] == week, dates)) if weekday is not None: dates = list(filter(lambda date: date.weekday() == weekday, dates)) return Calendar(dates)