import enum
import logging
import re
-from typing import NewType, Tuple
+from typing import Any, NewType, Tuple
import holidays # type: ignore
import pytz
)
-def datetime_to_date(date: datetime.datetime) -> datetime.date:
- return datetime.date(
- date.year,
- date.month,
- date.day
- )
+def datetime_to_date_and_time(
+ dt: datetime.datetime
+) -> Tuple[datetime.date, datetime.time]:
+ return (dt.date(), dt.timetz())
+
+
+def datetime_to_date(dt: datetime.datetime) -> datetime.date:
+ return datetime_to_date_and_time(dt)[0]
+
+
+def datetime_to_time(dt: datetime.datetime) -> datetime.time:
+ return datetime_to_date_and_time(dt)[1]
# An enum to represent units with which we can compute deltas.
MONTHS = 13
YEARS = 14
+ @classmethod
+ def is_valid(cls, value: Any):
+ if type(value) is int:
+ return value in cls._value2member_map_
+ elif type(value) is TimeUnit:
+ return value.value in cls._value2member_map_
+ elif type(value) is str:
+ return value in cls._member_names_
+ else:
+ print(type(value))
+ return False
+
def n_timeunits_from_base(
count: int,
unit: TimeUnit,
base: datetime.datetime
) -> datetime.datetime:
+ assert TimeUnit.is_valid(unit)
if count == 0:
return base
def parse_duration(duration: str) -> int:
"""Parse a duration in string form."""
+ if duration.isdigit():
+ return int(duration)
seconds = 0
m = re.search(r'(\d+) *d[ays]*', duration)
if m is not None: