Source code for ptr.datetime.time

"""PTR time module."""

from datetime import datetime

from .parser import dt, td
from ..element import Element


[docs]class WithTime: """Add Time properties to Element objects.""" def __add__(self, other): return self.datetime + td(other) # -> datetime def __sub__(self, other): try: return self.datetime - dt(other) # -> timedelta except ValueError: return self.datetime - td(other) # -> datetime def __gt__(self, other) -> bool: return (self - dt(other)).total_seconds() > 0 def __lt__(self, other) -> bool: return (self - dt(other)).total_seconds() < 0 def __ge__(self, other) -> bool: return (self - dt(other)).total_seconds() >= 0 def __le__(self, other) -> bool: return (self - dt(other)).total_seconds() <= 0 @property def datetime(self) -> datetime: """Datetime value.""" raise NotImplementedError
[docs] def edit(self, value): """Edit time value.""" raise NotImplementedError
@property def date(self): """Date value.""" return self.datetime.date() @property def time(self): """Time value.""" return self.datetime.time() @property def iso(self): """ISO formatted datetime.""" return self.datetime.isoformat()
[docs] def item(self) -> datetime: """Datetime value (numpy-like).""" return self.datetime
[docs] def offset(self, offset): """Shift time value.""" self.edit(self.datetime + td(offset)) return self
[docs]class Time(WithTime): """Generic Time object.""" def __init__(self, time): self._dt = dt(time) def __str__(self): return self.iso def __repr__(self): return f"{self.__class__.__name__}('{self.iso}')" def __eq__(self, other) -> bool: return self.datetime == dt(other) @property def datetime(self) -> datetime: """Datetime value.""" return self._dt
[docs] def edit(self, value): """Edit time value.""" self._dt = dt(value) return self
[docs]class ElementTime(WithTime, Element): """Time element. Parameters ---------- tag: str Element tag name. time: str, datetime.datetime or numpy.datetime64 Element time. description: str or list, optional Element description, put as a xml-comment on top of the element. Note ---- The element is parsed as a native datetime.datetime object, and display in XML in ISO format: ``YYYY-MM-DDThh:mm:ss``. """ def __init__(self, tag, time, description=None): if not description and isinstance(time, ElementTime): description = time.description super().__init__(tag, dt(time), description=description) @property def datetime(self) -> datetime: """Datetime value.""" return self[0]
[docs] def edit(self, value): """Edit time value.""" self._els[0] = dt(value) return self
[docs]class StartTime(ElementTime): """PTR start ElementTime element. Parameters ---------- time: str, datetime.datetime or numpy.datetime64 Element start time. description: str or list, optional Element description, put as a xml-comment on top of the element. """ def __init__(self, time, description=None): super().__init__('startTime', time, description=description)
[docs]class EndTime(ElementTime): """PTR end time element. Parameters ---------- time: str, datetime.datetime or numpy.datetime64 Element end time. description: str or list, optional Element description, put as a xml-comment on top of the element. """ def __init__(self, time, description=None): super().__init__('endTime', time, description=description)