Package yyyy_mm_dd

Expand source code
import datetime
from dateutil.relativedelta import relativedelta
import re
import math
from typing import Tuple, Union


def today() -> str:
    """
    Returns 'yyyy-mm-dd' date for today

    >>> today() == datetime.date.today().strftime('%Y-%m-%d')
    True
    """
    return datetime.date.today().strftime("%Y-%m-%d")


def yesterday() -> str:
    """
    Returns 'yyyy-mm-dd' date for yesterday

    >>> yesterday() == (datetime.date.today() - datetime.timedelta(1)).strftime('%Y-%m-%d')
    True
    """
    return yyyy_mm_dd(move_yyyy_mm_dd(today(), -1))


def tomorrow() -> str:
    """
    Returns 'yyyy-mm-dd' date for tomorrow

    >>> tomorrow() == (datetime.date.today() + datetime.timedelta(1)).strftime('%Y-%m-%d')
    True
    """
    return yyyy_mm_dd(move_yyyy_mm_dd(today(), 1))


def now() -> str:
    """
    Returns current datetime as 'yyyy-mm-ddThh:mm:ss'

    >>> now() == datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
    True
    """
    return datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")


def move_yyyy(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of years

    >>> move_yyyy('2020', 1)
    '2021'
    >>> move_yyyy('2020', -1)
    '2019'
    >>> move_yyyy('2020-02', 1)
    '2021-02'
    >>> move_yyyy('2020-02-14', 1)
    '2021-02-14'
    >>> move_yyyy('2020-02-14T10:20:30', 2)
    '2022-02-14T10:20:30'
    >>> move_yyyy(datetime.date(2020, 2, 14), 1)
    datetime.date(2021, 2, 14)
    >>> move_yyyy(datetime.datetime(2020, 2, 14, 0, 0), 1)
    datetime.datetime(2021, 2, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y")
    date += relativedelta(years=by)
    return _strftime(date, pattern)


def move_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of months

    >>> move_yyyy_mm('2020-02', 1)
    '2020-03'
    >>> move_yyyy_mm('2020-02', -1)
    '2020-01'
    >>> move_yyyy_mm('2020-01-31', 1)
    '2020-02-29'
    >>> move_yyyy_mm('2020-01-31', 25)
    '2022-02-28'
    >>> move_yyyy_mm('2020-02-14T10:20:30', 2)
    '2020-04-14T10:20:30'
    >>> move_yyyy_mm(datetime.date(2020, 2, 14), 1)
    datetime.date(2020, 3, 14)
    >>> move_yyyy_mm(datetime.datetime(2020, 2, 14, 0, 0), 1)
    datetime.datetime(2020, 3, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m")
    date += relativedelta(months=by)
    return _strftime(date, pattern)


def move_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of days

    >>> move_yyyy_mm_dd('2020-12-31', 1)
    '2021-01-01'
    >>> move_yyyy_mm_dd('2020-12-31', -1)
    '2020-12-30'
    >>> move_yyyy_mm_dd('2020-02-29T10:20:30', 2)
    '2020-03-02T10:20:30'
    >>> move_yyyy_mm_dd(datetime.date(2020, 2, 29), 1)
    datetime.date(2020, 3, 1)
    >>> move_yyyy_mm_dd(datetime.datetime(2020, 2, 29, 0, 0), 1)
    datetime.datetime(2020, 3, 1, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    date += relativedelta(days=by)
    return _strftime(date, pattern)


def move_yyyy_mm_dd_hh(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of hours

    >>> move_yyyy_mm_dd_hh('2020-12-31T23', 1)
    '2021-01-01T00'
    >>> move_yyyy_mm_dd_hh('2020-12-31T23', -1)
    '2020-12-31T22'
    >>> move_yyyy_mm_dd_hh('2020-02-29T10:20:30', 2)
    '2020-02-29T12:20:30'
    >>> move_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 11, 20, 30)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H")
    date += relativedelta(hours=by)
    return _strftime(date, pattern)


def move_yyyy_mm_dd_hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of minutes

    >>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', 1)
    '2021-01-01T00:00'
    >>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', -1)
    '2020-12-31T23:58'
    >>> move_yyyy_mm_dd_hh_mm('2020-02-29T10:20:30', 2)
    '2020-02-29T10:22:30'
    >>> move_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 10, 21, 30)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M")
    date += relativedelta(minutes=by)
    return _strftime(date, pattern)


def move_yyyy_mm_dd_hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of seconds

    >>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', 1)
    '2021-01-01T00:00:00'
    >>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', -2)
    '2020-12-31T23:59:57'
    >>> move_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 10, 20, 31)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M:%S")
    date += relativedelta(seconds=by)
    return _strftime(date, pattern)


def diff_yyyy(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of years between date A and date B

    >>> diff_yyyy("2020", "2021")
    1
    >>> diff_yyyy("2020-02", "2020-08")
    0
    >>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    1
    >>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:29")
    0
    >>> diff_yyyy("2021-02-14T10:20:30", "2020-02-14T10:20:30")
    -1
    >>> diff_yyyy(datetime.date(2020, 2, 14), datetime.date(2022, 2, 14))
    2
    """
    date_a, _ = _parse(a, at_least="%Y")
    date_b, _ = _parse(b, at_least="%Y")
    return relativedelta(date_b, date_a).years


def diff_yyyy_mm(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of months between date A and date B

    >>> diff_yyyy_mm("2020-03", "2020-04")
    1
    >>> diff_yyyy_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    12
    >>> diff_yyyy_mm("2020-02-14T10:20:30", "2020-01-14T10:20:30")
    -1
    >>> diff_yyyy_mm(datetime.date(2020, 2, 14), datetime.date(2020, 4, 14))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m")
    date_b, _ = _parse(b, at_least="%Y-%m")
    return relativedelta(date_b, date_a).years * 12 + relativedelta(date_b, date_a).months


def diff_yyyy_mm_dd(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of days between date A and date B

    >>> diff_yyyy_mm_dd("2020-02-01", "2020-03-01")
    29
    >>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    366
    >>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2020-02-13T10:20:30")
    -1
    >>> diff_yyyy_mm_dd("2020-02-14T10", "2020-02-15T09")
    0
    >>> diff_yyyy_mm_dd(datetime.date(2020, 2, 14), datetime.date(2020, 2, 16))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%d")
    date_b, _ = _parse(b, at_least="%Y-%m-%d")
    return (date_b - date_a).days


def diff_yyyy_mm_dd_hh(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of hours between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh("2020-02-01T10", "2020-02-01T11")
    1
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    8784
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2020-02-14T09:20:30")
    -1
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:30", "2020-02-14T11:29")
    0
    >>> diff_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 12, 20, 30))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H")
    return math.floor((date_b - date_a).total_seconds() / 3600)


def diff_yyyy_mm_dd_hh_mm(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of minutes between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh_mm("2020-02-01T10:20", "2020-02-01T10:21")
    1
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    527040
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2020-02-14T10:19:30")
    -1
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:30", "2020-02-14T10:30:30")
    0
    >>> diff_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 22, 30))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H:%M")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H:%M")
    return math.floor((date_b - date_a).total_seconds() / 60)


def diff_yyyy_mm_dd_hh_mm_ss(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of seconds between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-01T10:20:30", "2020-02-01T10:20:31")
    1
    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    31622400
    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2020-02-14T10:20:29")
    -1
    >>> diff_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 20, 32))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H:%M:%S")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H:%M:%S")
    return math.floor((date_b - date_a).total_seconds())


def start_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns first day of the year of a given date

    >>> start_of_yyyy('2020')
    '2020-01-01'
    >>> start_of_yyyy('2020-05-14')
    '2020-01-01'
    >>> start_of_yyyy(datetime.date(2020, 5, 14))
    datetime.date(2020, 1, 1)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y")
    date = datetime.datetime(date.year, 1, 1, 0, 0)
    if pattern not in ["date", "datetime"]:
        pattern = "%Y-%m-%d"

    return _strftime(date, pattern)


def start_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns first day of the month of a given date

    >>> start_of_yyyy_mm('2020-05')
    '2020-05-01'
    >>> start_of_yyyy_mm('2020-05-14')
    '2020-05-01'
    >>> start_of_yyyy_mm(datetime.date(2020, 5, 14))
    datetime.date(2020, 5, 1)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m")
    date = datetime.datetime(date.year, date.month, 1, 0, 0)
    if pattern not in ["date", "datetime"]:
        pattern = "%Y-%m-%d"

    return _strftime(date, pattern)


def start_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.datetime]:
    """
    Returns first datetime of the day of a given date

    >>> start_of_yyyy_mm_dd('2020-05-14')
    '2020-05-14T00:00:00'
    >>> start_of_yyyy_mm_dd('2020-05-14T13:25:10')
    '2020-05-14T00:00:00'
    >>> start_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
    datetime.datetime(2020, 5, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    date = datetime.datetime(date.year, date.month, date.day, 0, 0)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")


def start_of_yyyy_mm_dd_hh(yyyy_mm_dd: Union[str, datetime.datetime]) -> Union[str, datetime.datetime]:
    """
    Returns the start of the hour of a given datetime

    >>> start_of_yyyy_mm_dd_hh('2020-05-14T13:25:10')
    '2020-05-14T13:00:00'
    >>> start_of_yyyy_mm_dd_hh(datetime.datetime(2020, 5, 14, 23, 59))
    datetime.datetime(2020, 5, 14, 23, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%dT%H")
    date = datetime.datetime(date.year, date.month, date.day, date.hour, 0)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")


def start_of_yyyy_mm_dd_hh_mm(yyyy_mm_dd: Union[str, datetime.datetime]) -> Union[str, datetime.datetime]:
    """
    Returns the same datetime but with seconds at 0

    >>> start_of_yyyy_mm_dd_hh_mm('2020-05-14T13:25:10')
    '2020-05-14T13:25:00'
    >>> start_of_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 5, 14, 23, 59, 59))
    datetime.datetime(2020, 5, 14, 23, 59)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%dT%H:%M")
    date = datetime.datetime(date.year, date.month,
                             date.day, date.hour, date.minute)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")


def end_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last day of the year of a given date

    >>> end_of_yyyy('2020')
    '2020-12-31'
    >>> end_of_yyyy('2020-05-14')
    '2020-12-31'
    >>> end_of_yyyy(datetime.date(2020, 5, 14))
    datetime.date(2020, 12, 31)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")

    return move_yyyy_mm_dd(start_of_yyyy(move_yyyy(yyyy_mm_dd, 1)), -1)


def end_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last day of the month of a given date

    >>> end_of_yyyy_mm('2020-02')
    '2020-02-29'
    >>> end_of_yyyy_mm('2020-05-14')
    '2020-05-31'
    >>> end_of_yyyy_mm(datetime.date(2020, 5, 14))
    datetime.date(2020, 5, 31)
    """

    return move_yyyy_mm_dd(start_of_yyyy_mm(move_yyyy_mm(yyyy_mm_dd, 1)), -1)


def end_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last datetime of the day of a given date

    >>> end_of_yyyy_mm_dd('2020-05-14')
    '2020-05-14T23:59:59'
    >>> end_of_yyyy_mm_dd('2020-05-14T13:25:10')
    '2020-05-14T23:59:59'
    >>> end_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
    datetime.datetime(2020, 5, 14, 23, 59, 59)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")

    return move_yyyy_mm_dd_hh_mm_ss(start_of_yyyy_mm_dd(move_yyyy_mm_dd(yyyy_mm_dd, 1)), -1)


def yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the year of a given date

    >>> yyyy('2020-05-14')
    '2020'
    >>> yyyy(datetime.date(2020, 5, 14))
    '2020'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.strftime("%Y")


def yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the year and month of a given date

    >>> yyyy_mm('2020-05-14')
    '2020-05'
    >>> yyyy_mm(datetime.date(2020, 5, 14))
    '2020-05'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m")
    return date.strftime("%Y-%m")


def yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the date of a given datetime

    >>> yyyy_mm_dd('2020-05-14T10:20:30')
    '2020-05-14'
    >>> yyyy_mm_dd(datetime.date(2020, 5, 14))
    '2020-05-14'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    return date.strftime("%Y-%m-%d")


def hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> str:
    """
    Extracts the time of a given datetime

    >>> hh_mm_ss('2020-05-14T10:20:30')
    '10:20:30'
    >>> hh_mm_ss(datetime.datetime(2020, 5, 14, 10, 20, 30))
    '10:20:30'
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M:%S")
    return date.strftime("%H:%M:%S")


def hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> str:
    """
    Extracts the hour and minute of a given datetime

    >>> hh_mm('2020-05-14T10:20:30')
    '10:20'
    >>> hh_mm(datetime.datetime(2020, 5, 14, 10, 20, 30))
    '10:20'
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M")
    return date.strftime("%H:%M")


def year(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the year of a given date, similar to yyyy function but returns an int

    >>> year('2020-05-14')
    2020
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.year


def month(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the month of a given date

    >>> month('2020-05-14')
    5
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m")
    return date.month


def day(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the day of a given date

    >>> day('2020-05-14')
    14
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    return date.day


def hour(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> int:
    """
    Extracts the hour of a given datetime

    >>> hour('2020-05-14T05:10:58')
    5
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H")
    return date.hour


def from_yyyymmdd(yyyymmdd: str) -> str:
    """
    Converts a yyyymmdd date format (no dashes) to yyyy-mm-dd date format (with dashes)

    >>> from_yyyymmdd('20200514')
    '2020-05-14'
    """
    return datetime.datetime.strptime(yyyymmdd, "%Y%m%d").strftime("%Y-%m-%d")


def to_yyyymmdd(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Converts any partial or full yyyy-mm-ddThh:mm:ss to yyyymmdd date format (no dashes)

    >>> to_yyyymmdd('2020-05-14')
    '20200514'
    >>> to_yyyymmdd(datetime.date(2020, 5, 14))
    '20200514'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.strftime("%Y%m%d")


def to_datetime(yyyy_mm_dd: Union[str, datetime.date]) -> datetime.datetime:
    """
    Converts any partial or full yyyy-mm-ddThh:mm:ss to python datetime

    >>> to_datetime('2020-05')
    datetime.datetime(2020, 5, 1, 0, 0)
    >>> to_datetime('2020-05-14')
    datetime.datetime(2020, 5, 14, 0, 0)
    >>> to_datetime('2020-05-14T10:20:30')
    datetime.datetime(2020, 5, 14, 10, 20, 30)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date


def _parse(yyyy_mm_dd: Union[str, datetime.date, datetime.datetime], at_least: str) -> Tuple[datetime.datetime, str]:
    """
    >>> _parse('foo', '%Y')
    Traceback (most recent call last):
        ...
    ValueError: Could not parse date for operation, you should provide at least %Y

    >>> _parse('2020-01', '%Y-%m-%d')
    Traceback (most recent call last):
        ...
    ValueError: Could not parse date for operation, you should provide at least %Y-%m-%d

    >>> _parse('2020-01-01foobar', '%Y-%m-%d')
    Traceback (most recent call last):
        ...
    ValueError: unconverted data remains: foobar
    """
    if isinstance(yyyy_mm_dd, datetime.datetime):
        return (yyyy_mm_dd, "datetime")
    if isinstance(yyyy_mm_dd, datetime.date):
        return (datetime.datetime(yyyy_mm_dd.year, yyyy_mm_dd.month, yyyy_mm_dd.day), "datetime" if "%H" in at_least else "date")

    pattern = ""
    match = re.match(
        r"(\d{4})?-?(\d{2})?-?(\d{2})?T?(\d{2})?:?(\d{2})?:?(\d{2})?", yyyy_mm_dd)
    if not match:
        raise ValueError(
            "Could not parse date, it should be in YYYY-MM-DDTHH:MM:SS format")
    year, month, day, hour, minute, second = match.groups()
    if year is not None:
        pattern += "%Y"
    if month is not None:
        pattern += "-%m"
    if day is not None:
        pattern += "-%d"
    if hour is not None:
        pattern += "T%H"
    if minute is not None:
        pattern += ":%M"
    if second is not None:
        pattern += ":%S"
    if at_least not in pattern:
        raise ValueError(
            "Could not parse date for operation, you should provide at least %s" % at_least)

    return (datetime.datetime.strptime(yyyy_mm_dd, pattern), pattern)


def _strftime(date: datetime.datetime, pattern: str) -> Union[str, datetime.date]:
    if pattern == "date" and isinstance(date, datetime.datetime):
        return datetime.date(date.year, date.month, date.day)
    if pattern == "datetime":
        return date
    return date.strftime(pattern)

Functions

def day(yyyy_mm_dd: Union[str, datetime.date]) ‑> int

Extracts the day of a given date

>>> day('2020-05-14')
14
Expand source code
def day(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the day of a given date

    >>> day('2020-05-14')
    14
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    return date.day
def diff_yyyy(a: Union[str, datetime.date], b: Union[str, datetime.date]) ‑> int

Returns the amount of years between date A and date B

>>> diff_yyyy("2020", "2021")
1
>>> diff_yyyy("2020-02", "2020-08")
0
>>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:30")
1
>>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:29")
0
>>> diff_yyyy("2021-02-14T10:20:30", "2020-02-14T10:20:30")
-1
>>> diff_yyyy(datetime.date(2020, 2, 14), datetime.date(2022, 2, 14))
2
Expand source code
def diff_yyyy(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of years between date A and date B

    >>> diff_yyyy("2020", "2021")
    1
    >>> diff_yyyy("2020-02", "2020-08")
    0
    >>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    1
    >>> diff_yyyy("2020-02-14T10:20:30", "2021-02-14T10:20:29")
    0
    >>> diff_yyyy("2021-02-14T10:20:30", "2020-02-14T10:20:30")
    -1
    >>> diff_yyyy(datetime.date(2020, 2, 14), datetime.date(2022, 2, 14))
    2
    """
    date_a, _ = _parse(a, at_least="%Y")
    date_b, _ = _parse(b, at_least="%Y")
    return relativedelta(date_b, date_a).years
def diff_yyyy_mm(a: Union[str, datetime.date], b: Union[str, datetime.date]) ‑> int

Returns the amount of months between date A and date B

>>> diff_yyyy_mm("2020-03", "2020-04")
1
>>> diff_yyyy_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
12
>>> diff_yyyy_mm("2020-02-14T10:20:30", "2020-01-14T10:20:30")
-1
>>> diff_yyyy_mm(datetime.date(2020, 2, 14), datetime.date(2020, 4, 14))
2
Expand source code
def diff_yyyy_mm(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of months between date A and date B

    >>> diff_yyyy_mm("2020-03", "2020-04")
    1
    >>> diff_yyyy_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    12
    >>> diff_yyyy_mm("2020-02-14T10:20:30", "2020-01-14T10:20:30")
    -1
    >>> diff_yyyy_mm(datetime.date(2020, 2, 14), datetime.date(2020, 4, 14))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m")
    date_b, _ = _parse(b, at_least="%Y-%m")
    return relativedelta(date_b, date_a).years * 12 + relativedelta(date_b, date_a).months
def diff_yyyy_mm_dd(a: Union[str, datetime.date], b: Union[str, datetime.date]) ‑> int

Returns the amount of days between date A and date B

>>> diff_yyyy_mm_dd("2020-02-01", "2020-03-01")
29
>>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2021-02-14T10:20:30")
366
>>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2020-02-13T10:20:30")
-1
>>> diff_yyyy_mm_dd("2020-02-14T10", "2020-02-15T09")
0
>>> diff_yyyy_mm_dd(datetime.date(2020, 2, 14), datetime.date(2020, 2, 16))
2
Expand source code
def diff_yyyy_mm_dd(a: Union[str, datetime.date], b: Union[str, datetime.date]) -> int:
    """
    Returns the amount of days between date A and date B

    >>> diff_yyyy_mm_dd("2020-02-01", "2020-03-01")
    29
    >>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    366
    >>> diff_yyyy_mm_dd("2020-02-14T10:20:30", "2020-02-13T10:20:30")
    -1
    >>> diff_yyyy_mm_dd("2020-02-14T10", "2020-02-15T09")
    0
    >>> diff_yyyy_mm_dd(datetime.date(2020, 2, 14), datetime.date(2020, 2, 16))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%d")
    date_b, _ = _parse(b, at_least="%Y-%m-%d")
    return (date_b - date_a).days
def diff_yyyy_mm_dd_hh(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) ‑> int

Returns the amount of hours between datetime A and datetime B

>>> diff_yyyy_mm_dd_hh("2020-02-01T10", "2020-02-01T11")
1
>>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2021-02-14T10:20:30")
8784
>>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2020-02-14T09:20:30")
-1
>>> diff_yyyy_mm_dd_hh("2020-02-14T10:30", "2020-02-14T11:29")
0
>>> diff_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 12, 20, 30))
2
Expand source code
def diff_yyyy_mm_dd_hh(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of hours between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh("2020-02-01T10", "2020-02-01T11")
    1
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    8784
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:20:30", "2020-02-14T09:20:30")
    -1
    >>> diff_yyyy_mm_dd_hh("2020-02-14T10:30", "2020-02-14T11:29")
    0
    >>> diff_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 12, 20, 30))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H")
    return math.floor((date_b - date_a).total_seconds() / 3600)
def diff_yyyy_mm_dd_hh_mm(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) ‑> int

Returns the amount of minutes between datetime A and datetime B

>>> diff_yyyy_mm_dd_hh_mm("2020-02-01T10:20", "2020-02-01T10:21")
1
>>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
527040
>>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2020-02-14T10:19:30")
-1
>>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:30", "2020-02-14T10:30:30")
0
>>> diff_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 22, 30))
2
Expand source code
def diff_yyyy_mm_dd_hh_mm(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of minutes between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh_mm("2020-02-01T10:20", "2020-02-01T10:21")
    1
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    527040
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:20:30", "2020-02-14T10:19:30")
    -1
    >>> diff_yyyy_mm_dd_hh_mm("2020-02-14T10:30", "2020-02-14T10:30:30")
    0
    >>> diff_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 22, 30))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H:%M")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H:%M")
    return math.floor((date_b - date_a).total_seconds() / 60)
def diff_yyyy_mm_dd_hh_mm_ss(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) ‑> int

Returns the amount of seconds between datetime A and datetime B

>>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-01T10:20:30", "2020-02-01T10:20:31")
1
>>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2021-02-14T10:20:30")
31622400
>>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2020-02-14T10:20:29")
-1
>>> diff_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 20, 32))
2
Expand source code
def diff_yyyy_mm_dd_hh_mm_ss(a: Union[str, datetime.datetime], b: Union[str, datetime.datetime]) -> int:
    """
    Returns the amount of seconds between datetime A and datetime B

    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-01T10:20:30", "2020-02-01T10:20:31")
    1
    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2021-02-14T10:20:30")
    31622400
    >>> diff_yyyy_mm_dd_hh_mm_ss("2020-02-14T10:20:30", "2020-02-14T10:20:29")
    -1
    >>> diff_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 14, 10, 20, 30), datetime.datetime(2020, 2, 14, 10, 20, 32))
    2
    """
    date_a, _ = _parse(a, at_least="%Y-%m-%dT%H:%M:%S")
    date_b, _ = _parse(b, at_least="%Y-%m-%dT%H:%M:%S")
    return math.floor((date_b - date_a).total_seconds())
def end_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.date]

Returns last day of the year of a given date

>>> end_of_yyyy('2020')
'2020-12-31'
>>> end_of_yyyy('2020-05-14')
'2020-12-31'
>>> end_of_yyyy(datetime.date(2020, 5, 14))
datetime.date(2020, 12, 31)
Expand source code
def end_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last day of the year of a given date

    >>> end_of_yyyy('2020')
    '2020-12-31'
    >>> end_of_yyyy('2020-05-14')
    '2020-12-31'
    >>> end_of_yyyy(datetime.date(2020, 5, 14))
    datetime.date(2020, 12, 31)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")

    return move_yyyy_mm_dd(start_of_yyyy(move_yyyy(yyyy_mm_dd, 1)), -1)
def end_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.date]

Returns last day of the month of a given date

>>> end_of_yyyy_mm('2020-02')
'2020-02-29'
>>> end_of_yyyy_mm('2020-05-14')
'2020-05-31'
>>> end_of_yyyy_mm(datetime.date(2020, 5, 14))
datetime.date(2020, 5, 31)
Expand source code
def end_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last day of the month of a given date

    >>> end_of_yyyy_mm('2020-02')
    '2020-02-29'
    >>> end_of_yyyy_mm('2020-05-14')
    '2020-05-31'
    >>> end_of_yyyy_mm(datetime.date(2020, 5, 14))
    datetime.date(2020, 5, 31)
    """

    return move_yyyy_mm_dd(start_of_yyyy_mm(move_yyyy_mm(yyyy_mm_dd, 1)), -1)
def end_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.date]

Returns last datetime of the day of a given date

>>> end_of_yyyy_mm_dd('2020-05-14')
'2020-05-14T23:59:59'
>>> end_of_yyyy_mm_dd('2020-05-14T13:25:10')
'2020-05-14T23:59:59'
>>> end_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
datetime.datetime(2020, 5, 14, 23, 59, 59)
Expand source code
def end_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns last datetime of the day of a given date

    >>> end_of_yyyy_mm_dd('2020-05-14')
    '2020-05-14T23:59:59'
    >>> end_of_yyyy_mm_dd('2020-05-14T13:25:10')
    '2020-05-14T23:59:59'
    >>> end_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
    datetime.datetime(2020, 5, 14, 23, 59, 59)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")

    return move_yyyy_mm_dd_hh_mm_ss(start_of_yyyy_mm_dd(move_yyyy_mm_dd(yyyy_mm_dd, 1)), -1)
def from_yyyymmdd(yyyymmdd: str) ‑> str

Converts a yyyymmdd date format (no dashes) to yyyy-mm-dd date format (with dashes)

>>> from_yyyymmdd('20200514')
'2020-05-14'
Expand source code
def from_yyyymmdd(yyyymmdd: str) -> str:
    """
    Converts a yyyymmdd date format (no dashes) to yyyy-mm-dd date format (with dashes)

    >>> from_yyyymmdd('20200514')
    '2020-05-14'
    """
    return datetime.datetime.strptime(yyyymmdd, "%Y%m%d").strftime("%Y-%m-%d")
def hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) ‑> str

Extracts the hour and minute of a given datetime

>>> hh_mm('2020-05-14T10:20:30')
'10:20'
>>> hh_mm(datetime.datetime(2020, 5, 14, 10, 20, 30))
'10:20'
Expand source code
def hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> str:
    """
    Extracts the hour and minute of a given datetime

    >>> hh_mm('2020-05-14T10:20:30')
    '10:20'
    >>> hh_mm(datetime.datetime(2020, 5, 14, 10, 20, 30))
    '10:20'
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M")
    return date.strftime("%H:%M")
def hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) ‑> str

Extracts the time of a given datetime

>>> hh_mm_ss('2020-05-14T10:20:30')
'10:20:30'
>>> hh_mm_ss(datetime.datetime(2020, 5, 14, 10, 20, 30))
'10:20:30'
Expand source code
def hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> str:
    """
    Extracts the time of a given datetime

    >>> hh_mm_ss('2020-05-14T10:20:30')
    '10:20:30'
    >>> hh_mm_ss(datetime.datetime(2020, 5, 14, 10, 20, 30))
    '10:20:30'
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M:%S")
    return date.strftime("%H:%M:%S")
def hour(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) ‑> int

Extracts the hour of a given datetime

>>> hour('2020-05-14T05:10:58')
5
Expand source code
def hour(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime]) -> int:
    """
    Extracts the hour of a given datetime

    >>> hour('2020-05-14T05:10:58')
    5
    """
    date, _ = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H")
    return date.hour
def month(yyyy_mm_dd: Union[str, datetime.date]) ‑> int

Extracts the month of a given date

>>> month('2020-05-14')
5
Expand source code
def month(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the month of a given date

    >>> month('2020-05-14')
    5
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m")
    return date.month
def move_yyyy(yyyy_mm_dd: Union[str, datetime.date], by: int) ‑> Union[str, datetime.date]

Increases or decreases a date by a certain number of years

>>> move_yyyy('2020', 1)
'2021'
>>> move_yyyy('2020', -1)
'2019'
>>> move_yyyy('2020-02', 1)
'2021-02'
>>> move_yyyy('2020-02-14', 1)
'2021-02-14'
>>> move_yyyy('2020-02-14T10:20:30', 2)
'2022-02-14T10:20:30'
>>> move_yyyy(datetime.date(2020, 2, 14), 1)
datetime.date(2021, 2, 14)
>>> move_yyyy(datetime.datetime(2020, 2, 14, 0, 0), 1)
datetime.datetime(2021, 2, 14, 0, 0)
Expand source code
def move_yyyy(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of years

    >>> move_yyyy('2020', 1)
    '2021'
    >>> move_yyyy('2020', -1)
    '2019'
    >>> move_yyyy('2020-02', 1)
    '2021-02'
    >>> move_yyyy('2020-02-14', 1)
    '2021-02-14'
    >>> move_yyyy('2020-02-14T10:20:30', 2)
    '2022-02-14T10:20:30'
    >>> move_yyyy(datetime.date(2020, 2, 14), 1)
    datetime.date(2021, 2, 14)
    >>> move_yyyy(datetime.datetime(2020, 2, 14, 0, 0), 1)
    datetime.datetime(2021, 2, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y")
    date += relativedelta(years=by)
    return _strftime(date, pattern)
def move_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date], by: int) ‑> Union[str, datetime.date]

Increases or decreases a date by a certain number of months

>>> move_yyyy_mm('2020-02', 1)
'2020-03'
>>> move_yyyy_mm('2020-02', -1)
'2020-01'
>>> move_yyyy_mm('2020-01-31', 1)
'2020-02-29'
>>> move_yyyy_mm('2020-01-31', 25)
'2022-02-28'
>>> move_yyyy_mm('2020-02-14T10:20:30', 2)
'2020-04-14T10:20:30'
>>> move_yyyy_mm(datetime.date(2020, 2, 14), 1)
datetime.date(2020, 3, 14)
>>> move_yyyy_mm(datetime.datetime(2020, 2, 14, 0, 0), 1)
datetime.datetime(2020, 3, 14, 0, 0)
Expand source code
def move_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of months

    >>> move_yyyy_mm('2020-02', 1)
    '2020-03'
    >>> move_yyyy_mm('2020-02', -1)
    '2020-01'
    >>> move_yyyy_mm('2020-01-31', 1)
    '2020-02-29'
    >>> move_yyyy_mm('2020-01-31', 25)
    '2022-02-28'
    >>> move_yyyy_mm('2020-02-14T10:20:30', 2)
    '2020-04-14T10:20:30'
    >>> move_yyyy_mm(datetime.date(2020, 2, 14), 1)
    datetime.date(2020, 3, 14)
    >>> move_yyyy_mm(datetime.datetime(2020, 2, 14, 0, 0), 1)
    datetime.datetime(2020, 3, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m")
    date += relativedelta(months=by)
    return _strftime(date, pattern)
def move_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date], by: int) ‑> Union[str, datetime.date]

Increases or decreases a date by a certain number of days

>>> move_yyyy_mm_dd('2020-12-31', 1)
'2021-01-01'
>>> move_yyyy_mm_dd('2020-12-31', -1)
'2020-12-30'
>>> move_yyyy_mm_dd('2020-02-29T10:20:30', 2)
'2020-03-02T10:20:30'
>>> move_yyyy_mm_dd(datetime.date(2020, 2, 29), 1)
datetime.date(2020, 3, 1)
>>> move_yyyy_mm_dd(datetime.datetime(2020, 2, 29, 0, 0), 1)
datetime.datetime(2020, 3, 1, 0, 0)
Expand source code
def move_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a date by a certain number of days

    >>> move_yyyy_mm_dd('2020-12-31', 1)
    '2021-01-01'
    >>> move_yyyy_mm_dd('2020-12-31', -1)
    '2020-12-30'
    >>> move_yyyy_mm_dd('2020-02-29T10:20:30', 2)
    '2020-03-02T10:20:30'
    >>> move_yyyy_mm_dd(datetime.date(2020, 2, 29), 1)
    datetime.date(2020, 3, 1)
    >>> move_yyyy_mm_dd(datetime.datetime(2020, 2, 29, 0, 0), 1)
    datetime.datetime(2020, 3, 1, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    date += relativedelta(days=by)
    return _strftime(date, pattern)
def move_yyyy_mm_dd_hh(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) ‑> Union[str, datetime.date]

Increases or decreases a datetime by a certain number of hours

>>> move_yyyy_mm_dd_hh('2020-12-31T23', 1)
'2021-01-01T00'
>>> move_yyyy_mm_dd_hh('2020-12-31T23', -1)
'2020-12-31T22'
>>> move_yyyy_mm_dd_hh('2020-02-29T10:20:30', 2)
'2020-02-29T12:20:30'
>>> move_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
datetime.datetime(2020, 2, 29, 11, 20, 30)
Expand source code
def move_yyyy_mm_dd_hh(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of hours

    >>> move_yyyy_mm_dd_hh('2020-12-31T23', 1)
    '2021-01-01T00'
    >>> move_yyyy_mm_dd_hh('2020-12-31T23', -1)
    '2020-12-31T22'
    >>> move_yyyy_mm_dd_hh('2020-02-29T10:20:30', 2)
    '2020-02-29T12:20:30'
    >>> move_yyyy_mm_dd_hh(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 11, 20, 30)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H")
    date += relativedelta(hours=by)
    return _strftime(date, pattern)
def move_yyyy_mm_dd_hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) ‑> Union[str, datetime.date]

Increases or decreases a datetime by a certain number of minutes

>>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', 1)
'2021-01-01T00:00'
>>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', -1)
'2020-12-31T23:58'
>>> move_yyyy_mm_dd_hh_mm('2020-02-29T10:20:30', 2)
'2020-02-29T10:22:30'
>>> move_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
datetime.datetime(2020, 2, 29, 10, 21, 30)
Expand source code
def move_yyyy_mm_dd_hh_mm(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of minutes

    >>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', 1)
    '2021-01-01T00:00'
    >>> move_yyyy_mm_dd_hh_mm('2020-12-31T23:59', -1)
    '2020-12-31T23:58'
    >>> move_yyyy_mm_dd_hh_mm('2020-02-29T10:20:30', 2)
    '2020-02-29T10:22:30'
    >>> move_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 10, 21, 30)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M")
    date += relativedelta(minutes=by)
    return _strftime(date, pattern)
def move_yyyy_mm_dd_hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) ‑> Union[str, datetime.date]

Increases or decreases a datetime by a certain number of seconds

>>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', 1)
'2021-01-01T00:00:00'
>>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', -2)
'2020-12-31T23:59:57'
>>> move_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
datetime.datetime(2020, 2, 29, 10, 20, 31)
Expand source code
def move_yyyy_mm_dd_hh_mm_ss(yyyy_mm_dd_hh_mm_ss: Union[str, datetime.datetime], by: int) -> Union[str, datetime.date]:
    """
    Increases or decreases a datetime by a certain number of seconds

    >>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', 1)
    '2021-01-01T00:00:00'
    >>> move_yyyy_mm_dd_hh_mm_ss('2020-12-31T23:59:59', -2)
    '2020-12-31T23:59:57'
    >>> move_yyyy_mm_dd_hh_mm_ss(datetime.datetime(2020, 2, 29, 10, 20, 30), 1)
    datetime.datetime(2020, 2, 29, 10, 20, 31)
    """
    date, pattern = _parse(yyyy_mm_dd_hh_mm_ss, at_least="%Y-%m-%dT%H:%M:%S")
    date += relativedelta(seconds=by)
    return _strftime(date, pattern)
def now() ‑> str

Returns current datetime as 'yyyy-mm-ddThh:mm:ss'

>>> now() == datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
True
Expand source code
def now() -> str:
    """
    Returns current datetime as 'yyyy-mm-ddThh:mm:ss'

    >>> now() == datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
    True
    """
    return datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
def start_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.date]

Returns first day of the year of a given date

>>> start_of_yyyy('2020')
'2020-01-01'
>>> start_of_yyyy('2020-05-14')
'2020-01-01'
>>> start_of_yyyy(datetime.date(2020, 5, 14))
datetime.date(2020, 1, 1)
Expand source code
def start_of_yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns first day of the year of a given date

    >>> start_of_yyyy('2020')
    '2020-01-01'
    >>> start_of_yyyy('2020-05-14')
    '2020-01-01'
    >>> start_of_yyyy(datetime.date(2020, 5, 14))
    datetime.date(2020, 1, 1)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y")
    date = datetime.datetime(date.year, 1, 1, 0, 0)
    if pattern not in ["date", "datetime"]:
        pattern = "%Y-%m-%d"

    return _strftime(date, pattern)
def start_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.date]

Returns first day of the month of a given date

>>> start_of_yyyy_mm('2020-05')
'2020-05-01'
>>> start_of_yyyy_mm('2020-05-14')
'2020-05-01'
>>> start_of_yyyy_mm(datetime.date(2020, 5, 14))
datetime.date(2020, 5, 1)
Expand source code
def start_of_yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.date]:
    """
    Returns first day of the month of a given date

    >>> start_of_yyyy_mm('2020-05')
    '2020-05-01'
    >>> start_of_yyyy_mm('2020-05-14')
    '2020-05-01'
    >>> start_of_yyyy_mm(datetime.date(2020, 5, 14))
    datetime.date(2020, 5, 1)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m")
    date = datetime.datetime(date.year, date.month, 1, 0, 0)
    if pattern not in ["date", "datetime"]:
        pattern = "%Y-%m-%d"

    return _strftime(date, pattern)
def start_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) ‑> Union[str, datetime.datetime]

Returns first datetime of the day of a given date

>>> start_of_yyyy_mm_dd('2020-05-14')
'2020-05-14T00:00:00'
>>> start_of_yyyy_mm_dd('2020-05-14T13:25:10')
'2020-05-14T00:00:00'
>>> start_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
datetime.datetime(2020, 5, 14, 0, 0)
Expand source code
def start_of_yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> Union[str, datetime.datetime]:
    """
    Returns first datetime of the day of a given date

    >>> start_of_yyyy_mm_dd('2020-05-14')
    '2020-05-14T00:00:00'
    >>> start_of_yyyy_mm_dd('2020-05-14T13:25:10')
    '2020-05-14T00:00:00'
    >>> start_of_yyyy_mm_dd(datetime.date(2020, 5, 14))
    datetime.datetime(2020, 5, 14, 0, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    date = datetime.datetime(date.year, date.month, date.day, 0, 0)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")
def start_of_yyyy_mm_dd_hh(yyyy_mm_dd: Union[str, datetime.datetime]) ‑> Union[str, datetime.datetime]

Returns the start of the hour of a given datetime

>>> start_of_yyyy_mm_dd_hh('2020-05-14T13:25:10')
'2020-05-14T13:00:00'
>>> start_of_yyyy_mm_dd_hh(datetime.datetime(2020, 5, 14, 23, 59))
datetime.datetime(2020, 5, 14, 23, 0)
Expand source code
def start_of_yyyy_mm_dd_hh(yyyy_mm_dd: Union[str, datetime.datetime]) -> Union[str, datetime.datetime]:
    """
    Returns the start of the hour of a given datetime

    >>> start_of_yyyy_mm_dd_hh('2020-05-14T13:25:10')
    '2020-05-14T13:00:00'
    >>> start_of_yyyy_mm_dd_hh(datetime.datetime(2020, 5, 14, 23, 59))
    datetime.datetime(2020, 5, 14, 23, 0)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%dT%H")
    date = datetime.datetime(date.year, date.month, date.day, date.hour, 0)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")
def start_of_yyyy_mm_dd_hh_mm(yyyy_mm_dd: Union[str, datetime.datetime]) ‑> Union[str, datetime.datetime]

Returns the same datetime but with seconds at 0

>>> start_of_yyyy_mm_dd_hh_mm('2020-05-14T13:25:10')
'2020-05-14T13:25:00'
>>> start_of_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 5, 14, 23, 59, 59))
datetime.datetime(2020, 5, 14, 23, 59)
Expand source code
def start_of_yyyy_mm_dd_hh_mm(yyyy_mm_dd: Union[str, datetime.datetime]) -> Union[str, datetime.datetime]:
    """
    Returns the same datetime but with seconds at 0

    >>> start_of_yyyy_mm_dd_hh_mm('2020-05-14T13:25:10')
    '2020-05-14T13:25:00'
    >>> start_of_yyyy_mm_dd_hh_mm(datetime.datetime(2020, 5, 14, 23, 59, 59))
    datetime.datetime(2020, 5, 14, 23, 59)
    """
    date, pattern = _parse(yyyy_mm_dd, at_least="%Y-%m-%dT%H:%M")
    date = datetime.datetime(date.year, date.month,
                             date.day, date.hour, date.minute)
    if pattern in ["date", "datetime"]:
        return date
    return date.strftime("%Y-%m-%dT%H:%M:%S")
def to_datetime(yyyy_mm_dd: Union[str, datetime.date]) ‑> datetime.datetime

Converts any partial or full yyyy-mm-ddThh:mm:ss to python datetime

>>> to_datetime('2020-05')
datetime.datetime(2020, 5, 1, 0, 0)
>>> to_datetime('2020-05-14')
datetime.datetime(2020, 5, 14, 0, 0)
>>> to_datetime('2020-05-14T10:20:30')
datetime.datetime(2020, 5, 14, 10, 20, 30)
Expand source code
def to_datetime(yyyy_mm_dd: Union[str, datetime.date]) -> datetime.datetime:
    """
    Converts any partial or full yyyy-mm-ddThh:mm:ss to python datetime

    >>> to_datetime('2020-05')
    datetime.datetime(2020, 5, 1, 0, 0)
    >>> to_datetime('2020-05-14')
    datetime.datetime(2020, 5, 14, 0, 0)
    >>> to_datetime('2020-05-14T10:20:30')
    datetime.datetime(2020, 5, 14, 10, 20, 30)
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date
def to_yyyymmdd(yyyy_mm_dd: Union[str, datetime.date]) ‑> str

Converts any partial or full yyyy-mm-ddThh:mm:ss to yyyymmdd date format (no dashes)

>>> to_yyyymmdd('2020-05-14')
'20200514'
>>> to_yyyymmdd(datetime.date(2020, 5, 14))
'20200514'
Expand source code
def to_yyyymmdd(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Converts any partial or full yyyy-mm-ddThh:mm:ss to yyyymmdd date format (no dashes)

    >>> to_yyyymmdd('2020-05-14')
    '20200514'
    >>> to_yyyymmdd(datetime.date(2020, 5, 14))
    '20200514'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.strftime("%Y%m%d")
def today() ‑> str

Returns 'yyyy-mm-dd' date for today

>>> today() == datetime.date.today().strftime('%Y-%m-%d')
True
Expand source code
def today() -> str:
    """
    Returns 'yyyy-mm-dd' date for today

    >>> today() == datetime.date.today().strftime('%Y-%m-%d')
    True
    """
    return datetime.date.today().strftime("%Y-%m-%d")
def tomorrow() ‑> str

Returns 'yyyy-mm-dd' date for tomorrow

>>> tomorrow() == (datetime.date.today() + datetime.timedelta(1)).strftime('%Y-%m-%d')
True
Expand source code
def tomorrow() -> str:
    """
    Returns 'yyyy-mm-dd' date for tomorrow

    >>> tomorrow() == (datetime.date.today() + datetime.timedelta(1)).strftime('%Y-%m-%d')
    True
    """
    return yyyy_mm_dd(move_yyyy_mm_dd(today(), 1))
def year(yyyy_mm_dd: Union[str, datetime.date]) ‑> int

Extracts the year of a given date, similar to yyyy function but returns an int

>>> year('2020-05-14')
2020
Expand source code
def year(yyyy_mm_dd: Union[str, datetime.date]) -> int:
    """
    Extracts the year of a given date, similar to yyyy function but returns an int

    >>> year('2020-05-14')
    2020
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.year
def yesterday() ‑> str

Returns 'yyyy-mm-dd' date for yesterday

>>> yesterday() == (datetime.date.today() - datetime.timedelta(1)).strftime('%Y-%m-%d')
True
Expand source code
def yesterday() -> str:
    """
    Returns 'yyyy-mm-dd' date for yesterday

    >>> yesterday() == (datetime.date.today() - datetime.timedelta(1)).strftime('%Y-%m-%d')
    True
    """
    return yyyy_mm_dd(move_yyyy_mm_dd(today(), -1))
def yyyy(yyyy_mm_dd: Union[str, datetime.date]) ‑> str

Extracts the year of a given date

>>> yyyy('2020-05-14')
'2020'
>>> yyyy(datetime.date(2020, 5, 14))
'2020'
Expand source code
def yyyy(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the year of a given date

    >>> yyyy('2020-05-14')
    '2020'
    >>> yyyy(datetime.date(2020, 5, 14))
    '2020'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y")
    return date.strftime("%Y")
def yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) ‑> str

Extracts the year and month of a given date

>>> yyyy_mm('2020-05-14')
'2020-05'
>>> yyyy_mm(datetime.date(2020, 5, 14))
'2020-05'
Expand source code
def yyyy_mm(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the year and month of a given date

    >>> yyyy_mm('2020-05-14')
    '2020-05'
    >>> yyyy_mm(datetime.date(2020, 5, 14))
    '2020-05'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m")
    return date.strftime("%Y-%m")
def yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) ‑> str

Extracts the date of a given datetime

>>> yyyy_mm_dd('2020-05-14T10:20:30')
'2020-05-14'
>>> yyyy_mm_dd(datetime.date(2020, 5, 14))
'2020-05-14'
Expand source code
def yyyy_mm_dd(yyyy_mm_dd: Union[str, datetime.date]) -> str:
    """
    Extracts the date of a given datetime

    >>> yyyy_mm_dd('2020-05-14T10:20:30')
    '2020-05-14'
    >>> yyyy_mm_dd(datetime.date(2020, 5, 14))
    '2020-05-14'
    """
    date, _ = _parse(yyyy_mm_dd, at_least="%Y-%m-%d")
    return date.strftime("%Y-%m-%d")