Source code for tradeexecutor.utils.timestamp

"""Timestamp  and timedelta helpers"""
import calendar
import datetime
from typing import Union

import pandas as pd


[docs]def convert_and_validate_timestamp(timestamp: Union[pd.Timestamp, datetime.datetime]) -> datetime.datetime: """Ensure the timestamp is converted to our internal state format. - Strategies deal with Pandas timestamps - State stores internally datetime.datetime, no timezone, all UTC """ if isinstance(timestamp, pd.Timestamp): timestamp = timestamp.to_pydatetime() elif isinstance(timestamp, datetime.datetime): # Good pass else: raise RuntimeError(f"Unknown timestamp input: {timestamp}") assert timestamp.tzinfo is None return timestamp
[docs]def convert_and_validate_timestamp_as_int(timestamp: Union[pd.Timestamp, datetime.datetime]) -> int: """Serialise timestamp as UNIX epoch seconds UTC. Needed when we need to have time based keys in our state, as the current JSON encoder cannot directly encode datetime.datetime keys. :return: UNIX UTC timestamp """ timestamp = convert_and_validate_timestamp(timestamp) # https://stackoverflow.com/a/5499906/315168 return int(calendar.timegm(timestamp.utctimetuple()))
[docs]def convert_and_validate_timestamp_as_float(timestamp: Union[pd.Timestamp, datetime.datetime]) -> float: """Serialise timestamp as UNIX epoch seconds UTC. Needed when we need to have time based keys in our state, as the current JSON encoder cannot directly encode datetime.datetime keys. :return: UNIX UTC timestamp """ timestamp = convert_and_validate_timestamp(timestamp) # https://stackoverflow.com/a/5499906/315168 return calendar.timegm(timestamp.utctimetuple())
[docs]def json_encode_timedelta(val: datetime.timedelta | None) -> float | None: """Encode timestamp objects as number of seconds passed""" if val is None: return None return val.total_seconds()
[docs]def json_decode_timedelta(val: float | None) -> datetime.timedelta | None: """Decode timestamp objects as number of seconds passed""" if val is None: return None return datetime.timedelta(seconds=val)