Source code for relsad.Time

from enum import Enum
from numbers import Number


[docs]class TimeUnit(Enum): """ Time unit Attributes ---------- SECOND : int Second MINUTE : int Minute HOUR : int Hour DAY : int Day WEEK : int Week MONTH : int Month YEAR : int Year """ SECOND = 1 MINUTE = 2 HOUR = 3 DAY = 4 WEEK = 5 MONTH = 6 YEAR = 7
[docs]class Time: """ Time utility class ... Attributes ---------- SEC_per_MIN : float Seconds in a minute MIN_per_HOUR : float Minutes in an hour HOUR_per_DAY : float Hours in a day DAY_per_WEEK : float Days in a week WEEK_per_MONTH : float Weeks in a month MONTH_per_YEAR : float Months in a year quantity : float Time quantity, the quantity of a time unit unit : TimeUnit The time unit Methods ---------- convert_unit(unit) Converts the time based on the sat time unit to the correct time get_unit_quantity(unit) Returns the time quantity of the class instance in the given unit get_seconds() Returns the time quantity in seconds get_minutes() Returns the time quantity in minutes get_hours() Returns the time quantity in hours get_days() Returns the time quantity in days get_months() Returns the time quantity in months get_years() Returns the time quantity in year """ SEC_per_MIN = 60 MIN_per_HOUR = 60 HOUR_per_DAY = 24 DAY_per_WEEK = 7 WEEK_per_MONTH = 4.3452 MONTH_per_YEAR = 12 def __init__(self, quantity: float, unit: TimeUnit = TimeUnit.HOUR): if not isinstance(quantity, Number): raise Exception("The time quantity must be a number.") self.quantity = quantity self.unit = unit def __str__(self): if self.unit == TimeUnit.SECOND: return f"SEC_{self.quantity}" elif self.unit == TimeUnit.MINUTE: return f"MIN_{self.quantity}" elif self.unit == TimeUnit.HOUR: return f"HOUR_{self.quantity}" elif self.unit == TimeUnit.DAY: return f"DAY_{self.quantity}" elif self.unit == TimeUnit.WEEK: return f"WEEK_{self.quantity}" elif self.unit == TimeUnit.MONTH: return f"MONTH_{self.quantity}" elif self.unit == TimeUnit.YEAR: return f"YEAR_{self.quantity}" def __repr__(self): if self.unit == TimeUnit.SECOND: return f"SEC_{self.quantity}" elif self.unit == TimeUnit.MINUTE: return f"MIN_{self.quantity}" elif self.unit == TimeUnit.HOUR: return f"HOUR_{self.quantity}" elif self.unit == TimeUnit.DAY: return f"DAY_{self.quantity}" elif self.unit == TimeUnit.WEEK: return f"WEEK_{self.quantity}" elif self.unit == TimeUnit.MONTH: return f"MONTH_{self.quantity}" elif self.unit == TimeUnit.YEAR: return f"YEAR_{self.quantity}" def __hash__(self): if self.unit == TimeUnit.SECOND: return hash(f"SEC_{self.quantity}") elif self.unit == TimeUnit.MINUTE: return hash(f"MIN_{self.quantity}") elif self.unit == TimeUnit.HOUR: return hash(f"HOUR_{self.quantity}") elif self.unit == TimeUnit.DAY: return hash(f"DAY_{self.quantity}") elif self.unit == TimeUnit.WEEK: return hash(f"WEEK_{self.quantity}") elif self.unit == TimeUnit.MONTH: return hash(f"MONTH_{self.quantity}") elif self.unit == TimeUnit.YEAR: return hash(f"YEAR_{self.quantity}")
[docs] def convert_unit(self, unit: TimeUnit): """ Converts the time based on the sat time unit to the correct time Parameters ---------- unit : TimeUnit The time unit Returns ---------- None """ if unit == TimeUnit.SECOND: self.quantity = self.get_seconds() self.unit = TimeUnit.SECOND elif unit == TimeUnit.MINUTE: self.quantity = self.get_minutes() self.unit = TimeUnit.MINUTE elif unit == TimeUnit.HOUR: self.quantity = self.get_hours() self.unit = TimeUnit.HOUR elif unit == TimeUnit.DAY: self.quantity = self.get_days() self.unit = TimeUnit.DAY elif unit == TimeUnit.WEEK: self.quantity = self.get_weeks() self.unit = TimeUnit.WEEK elif unit == TimeUnit.MONTH: self.quantity = self.get_months() self.unit = TimeUnit.MONTH elif unit == TimeUnit.YEAR: self.quantity = self.get_years() self.unit = TimeUnit.YEAR
[docs] def get_unit_quantity(self, unit: TimeUnit): """ Returns the time quantity of the class instance in the given unit Parameters ---------- unit : TimeUnit The time unit Returns ---------- time_quantity : float The time quantity of the class instance in the given unit """ time_quantity = 0 if unit == TimeUnit.SECOND: time_quantity = self.get_seconds() elif unit == TimeUnit.MINUTE: time_quantity = self.get_minutes() elif unit == TimeUnit.HOUR: time_quantity = self.get_hours() elif unit == TimeUnit.DAY: time_quantity = self.get_days() elif unit == TimeUnit.WEEK: time_quantity = self.get_weeks() elif unit == TimeUnit.MONTH: time_quantity = self.get_months() elif unit == TimeUnit.YEAR: time_quantity = self.get_years() return time_quantity
def __lt__(self, other): return isinstance( other, self.__class__ ) and self.quantity < other.get_unit_quantity(self.unit) def __le__(self, other): return isinstance( other, self.__class__ ) and self.quantity <= other.get_unit_quantity(self.unit) def __gt__(self, other): return isinstance( other, self.__class__ ) and self.quantity > other.get_unit_quantity(self.unit) def __ge__(self, other): return isinstance( other, self.__class__ ) and self.quantity >= other.get_unit_quantity(self.unit) def __eq__(self, other): return isinstance( other, self.__class__ ) and self.quantity == other.get_unit_quantity(self.unit) def __ne__(self, other): return isinstance( other, self.__class__ ) and self.quantity != other.get_unit_quantity(self.unit) def __add__(self, other): if not isinstance(other, self.__class__): raise Exception("Wrong type") return Time( self.quantity + other.get_unit_quantity(self.unit), self.unit ) def __sub__(self, other): if not isinstance(other, self.__class__): raise Exception("Wrong type") return Time( self.quantity - other.get_unit_quantity(self.unit), self.unit ) def __truediv__(self, other): if not isinstance(other, self.__class__): raise Exception("Wrong type") if other.get_hours() == 0: raise Exception("Other time is zero") return self.get_hours() / other.get_hours()
[docs] def get_seconds(self): """ Returns the time quantity in seconds Parameters ---------- None Returns ---------- seconds : float The time quantity in seconds """ seconds = 0 if self.unit == TimeUnit.SECOND: seconds = self.quantity elif self.unit == TimeUnit.MINUTE: seconds = self.quantity * self.SEC_per_MIN elif self.unit == TimeUnit.HOUR: seconds = self.quantity * self.SEC_per_MIN * self.MIN_per_HOUR elif self.unit == TimeUnit.DAY: seconds = ( self.quantity * self.SEC_per_MIN * self.MIN_per_HOUR * self.HOUR_per_DAY ) elif self.unit == TimeUnit.WEEK: seconds = ( self.quantity * self.SEC_per_MIN * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK ) elif self.unit == TimeUnit.MONTH: seconds = ( self.quantity * self.SEC_per_MIN * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH ) elif self.unit == TimeUnit.YEAR: seconds = ( self.quantity * self.SEC_per_MIN * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH * self.MONTH_per_YEAR ) return seconds
[docs] def get_minutes(self): """ Returns the time quantity in minutes Parameters ---------- None Returns ---------- minutes : float The time quantity in minutes """ minutes = 0 if self.unit == TimeUnit.SECOND: minutes = self.quantity / self.SEC_per_MIN elif self.unit == TimeUnit.MINUTE: minutes = self.quantity elif self.unit == TimeUnit.HOUR: minutes = self.quantity * self.MIN_per_HOUR elif self.unit == TimeUnit.DAY: minutes = self.quantity * self.MIN_per_HOUR * self.HOUR_per_DAY elif self.unit == TimeUnit.WEEK: minutes = ( self.quantity * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK ) elif self.unit == TimeUnit.MONTH: minutes = ( self.quantity * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH ) elif self.unit == TimeUnit.YEAR: minutes = ( self.quantity * self.MIN_per_HOUR * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH * self.MONTH_per_YEAR ) return minutes
[docs] def get_hours(self): """ Returns the time quantity in hours Parameters ---------- None Returns ---------- hours : float The time quantity in hours """ hours = 0 if self.unit == TimeUnit.SECOND: hours = self.quantity / self.SEC_per_MIN / self.MIN_per_HOUR elif self.unit == TimeUnit.MINUTE: hours = self.quantity / self.MIN_per_HOUR elif self.unit == TimeUnit.HOUR: hours = self.quantity elif self.unit == TimeUnit.DAY: hours = self.quantity * self.HOUR_per_DAY elif self.unit == TimeUnit.WEEK: hours = self.quantity * self.HOUR_per_DAY * self.DAY_per_WEEK elif self.unit == TimeUnit.MONTH: hours = ( self.quantity * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH ) elif self.unit == TimeUnit.YEAR: hours = ( self.quantity * self.HOUR_per_DAY * self.DAY_per_WEEK * self.WEEK_per_MONTH * self.MONTH_per_YEAR ) return hours
[docs] def get_days(self): """ Returns the time quantity in days Parameters ---------- None Returns ---------- days : float The time quantity in days """ days = 0 if self.unit == TimeUnit.SECOND: days = ( self.quantity / self.SEC_per_MIN / self.MIN_per_HOUR / self.HOUR_per_DAY ) elif self.unit == TimeUnit.MINUTE: days = self.quantity / self.MIN_per_HOUR / self.HOUR_per_DAY elif self.unit == TimeUnit.HOUR: days = self.quantity / self.HOUR_per_DAY elif self.unit == TimeUnit.DAY: days = self.quantity elif self.unit == TimeUnit.WEEK: days = self.quantity * self.DAY_per_WEEK elif self.unit == TimeUnit.MONTH: days = self.quantity * self.DAY_per_WEEK * self.WEEK_per_MONTH elif self.unit == TimeUnit.YEAR: days = ( self.quantity * self.DAY_per_WEEK * self.WEEK_per_MONTH * self.MONTH_per_YEAR ) return days
[docs] def get_weeks(self): """ Returns the time quantity in weeks Parameters ---------- None Returns ---------- weeks : float The time quantity in weeks """ weeks = 0 if self.unit == TimeUnit.SECOND: weeks = ( self.quantity / self.SEC_per_MIN / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK ) elif self.unit == TimeUnit.MINUTE: weeks = ( self.quantity / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK ) elif self.unit == TimeUnit.HOUR: weeks = self.quantity / self.HOUR_per_DAY / self.DAY_per_WEEK elif self.unit == TimeUnit.DAY: weeks = self.quantity / self.DAY_per_WEEK elif self.unit == TimeUnit.WEEK: weeks = self.quantity elif self.unit == TimeUnit.MONTH: weeks = self.quantity * self.WEEK_per_MONTH elif self.unit == TimeUnit.YEAR: weeks = self.quantity * self.WEEK_per_MONTH * self.MONTH_per_YEAR return weeks
[docs] def get_months(self): """ Returns the time quantity in months Parameters ---------- None Returns ---------- months : float The time quantity in months """ months = 0 if self.unit == TimeUnit.SECOND: months = ( self.quantity / self.SEC_per_MIN / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH ) elif self.unit == TimeUnit.MINUTE: months = ( self.quantity / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH ) elif self.unit == TimeUnit.HOUR: months = ( self.quantity / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH ) elif self.unit == TimeUnit.DAY: months = self.quantity / self.DAY_per_WEEK / self.WEEK_per_MONTH elif self.unit == TimeUnit.WEEK: months = self.quantity / self.WEEK_per_MONTH elif self.unit == TimeUnit.MONTH: months = self.quantity elif self.unit == TimeUnit.YEAR: months = self.quantity * self.MONTH_per_YEAR return months
[docs] def get_years(self): """ Returns the time quantity in years Parameters ---------- None Returns ---------- years : float The time quantity in years """ years = 0 if self.unit == TimeUnit.SECOND: years = ( self.quantity / self.SEC_per_MIN / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH / self.MONTH_per_YEAR ) elif self.unit == TimeUnit.MINUTE: years = ( self.quantity / self.MIN_per_HOUR / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH / self.MONTH_per_YEAR ) elif self.unit == TimeUnit.HOUR: years = ( self.quantity / self.HOUR_per_DAY / self.DAY_per_WEEK / self.WEEK_per_MONTH / self.MONTH_per_YEAR ) elif self.unit == TimeUnit.DAY: years = ( self.quantity / self.DAY_per_WEEK / self.WEEK_per_MONTH / self.MONTH_per_YEAR ) elif self.unit == TimeUnit.WEEK: years = self.quantity / self.WEEK_per_MONTH / self.MONTH_per_YEAR elif self.unit == TimeUnit.MONTH: years = self.quantity / self.MONTH_per_YEAR elif self.unit == TimeUnit.YEAR: years = self.quantity return years
[docs]class TimeStamp: """ Time stamp utility class ... Attributes ---------- year : int Number of years month : int Number of months day : int Number of days hour : int Number of hours minute : int Number of minutes second : int Number of seconds Methods ---------- get_hour_of_day(time_passed) Returns the hour of day based on the time passed """ def __init__( self, year: int = 0, month: int = 0, day: int = 0, hour: int = 0, minute: int = 0, second: int = 0, ): self.year = year self.month = month self.day = day self.hour = hour self.minute = minute self.second = second # Calculate time quantity self.time_quantity = Time(0, TimeUnit.SECOND) self.time_quantity += Time(year, TimeUnit.YEAR) self.time_quantity += Time(month, TimeUnit.MONTH) self.time_quantity += Time(day, TimeUnit.DAY) self.time_quantity += Time(hour, TimeUnit.HOUR) self.time_quantity += Time(minute, TimeUnit.MINUTE) self.time_quantity += Time(second, TimeUnit.SECOND) def __str__(self): return ( f"TIMESTAMP_Y{self.year}-" + f"M{self.month}-" + f"D{self.day}_" + f"H{self.hour}:" + f"M{self.month}:" + f"S{self.second}" ) def __repr__(self): return ( f"TIMESTAMP_Y{self.year}-" + f"M{self.month}-" + f"D{self.day}_" + f"H{self.hour}:" + f"M{self.minute}:" + f"S{self.second}" ) def __hash__(self): return hash( f"TIMESTAMP_Y{self.year}-" + f"M{self.month}-" + f"D{self.day}_" + f"H{self.hour}:" + f"M{self.minute}:" + f"S{self.second}" )
[docs] def get_hour_of_day(self, time_passed: Time): """ Returns the hour of day based on the time passed Parameters ---------- time_passed : Time Time passed Returns ---------- hour_of_day : int The hour of day based on the time passed """ if not isinstance(time_passed, Time): raise Exception("Wrong type") dup = Time(time_passed.quantity, time_passed.unit) if dup.get_years() > 1: y = int(dup.get_years()) dup -= Time(y, TimeUnit.YEAR) if dup.get_months() > 1: m = int(dup.get_months()) dup -= Time(m, TimeUnit.MONTH) if dup.get_days() > 1: d = int(dup.get_days()) dup -= Time(d, TimeUnit.DAY) dup -= Time(self.hour, TimeUnit.HOUR) dup += Time(self.minute, TimeUnit.MINUTE) dup += Time(self.second, TimeUnit.SECOND) hour_of_day = int(dup.get_hours()) return hour_of_day
def __sub__(self, other): if not isinstance(other, self.__class__): raise Exception("Wrong type") return ( Time(self.year - other.year, TimeUnit.YEAR) + Time(self.month - other.month, TimeUnit.MONTH) + Time(self.day - other.day, TimeUnit.DAY) + Time(self.hour - other.hour, TimeUnit.HOUR) + Time(self.minute - other.minute, TimeUnit.MINUTE) + Time(self.second - other.second, TimeUnit.SECOND) )
if __name__ == "__main__": t1 = Time(5, TimeUnit.MINUTE) print(t1.get_years()) print(t1.get_hours()) t2 = Time(1, TimeUnit.HOUR) print(t2.get_years()) print(t2.get_hours())