Beispiel #1
0
 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])
Beispiel #2
0
    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]
Beispiel #3
0
    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]
Beispiel #4
0
    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)