Skip to content
Snippets Groups Projects
FireTime.py 5.04 KiB
Newer Older
Yang's avatar
Yang committed
""" FireTime
This module include functions used to handle the time conversion

The time step in the tracking system is defined as a list (year, month, day, ampm).
The following functions are used to convert times between different formats.

    t : time steps, tuple (year,month,day,ampm)
    d : date, datetime.date()
    ampm : ampm, str()
    dt : time steps, datetime.datetime()

"""

Yang's avatar
Yang committed

def t_nb(t, nb="next"):
    """ Calculate the next or previous time step (year, month, day, ampm)
Yang's avatar
Yang committed
    Parameters
    ----------
    t : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM' for present time
    nb : str, 'next'|'previous'
        option to extract next or previous time step

    Returns
    -------
    t_out : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM' for next/previous time
Yang's avatar
Yang committed
    """
Yang's avatar
Yang committed
    from datetime import date, timedelta

    # the next time step
Yang's avatar
Yang committed
    if nb == "next":
Yang's avatar
Yang committed
        # if current time is 'AM', set next time as the current day and 'PM'
Yang's avatar
Yang committed
        if t[-1] == "AM":
Yang's avatar
Yang committed
            t_out = list(t[:-1])
Yang's avatar
Yang committed
            t_out.append("PM")
Yang's avatar
Yang committed
        # if current time is 'PM', set next time as the following day and 'AM'
        else:
            d = date(*t[:-1])
            d_out = d + timedelta(days=1)
Yang's avatar
Yang committed
            t_out = [d_out.year, d_out.month, d_out.day, "AM"]
Yang's avatar
Yang committed

    # the previous time step
Yang's avatar
Yang committed
    elif nb == "previous":
Yang's avatar
Yang committed
        # if current time is 'PM', set previous time as the current day and 'AM'
Yang's avatar
Yang committed
        if t[-1] == "PM":
Yang's avatar
Yang committed
            t_out = list(t[:-1])
Yang's avatar
Yang committed
            t_out.append("AM")
Yang's avatar
Yang committed
        # if current time is 'AM', set previous time as the previous day and 'PM'
        else:
            d = date(*t[:-1])
            d_out = d + timedelta(days=-1)
Yang's avatar
Yang committed
            t_out = [d_out.year, d_out.month, d_out.day, "PM"]
Yang's avatar
Yang committed
    return t_out

Yang's avatar
Yang committed

def t_dif(t1, t2):
    """ calculate the time difference between two time steps
Yang's avatar
Yang committed
    Parameters
    ----------
    t1 : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM' for time 1
    t2 : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM' for time 2

    Returns
    -------
    dt : float
        time difference in days (t2-t1), half day as 0.5
Yang's avatar
Yang committed
    """
Yang's avatar
Yang committed
    from datetime import date

    # calculate the day difference
    d1 = date(*t1[:-1])
    d2 = date(*t2[:-1])
Yang's avatar
Yang committed
    dt = (d2 - d1).days
Yang's avatar
Yang committed

    # adjust according to ampm difference
    if t1[-1] != t2[-1]:
Yang's avatar
Yang committed
        if t1[-1] == "PM":
Yang's avatar
Yang committed
            dt -= 0.5
        else:
            dt += 0.5
    return dt

def dt_dif(dt1,dt2):
    ''' given two datatime values, calculate the differences (in days)
    '''
    daysdif = (dt1-dt2).seconds/24/3600 + (dt1-dt2).days
    return daysdif
Yang's avatar
Yang committed
def t2d(t):
Yang's avatar
Yang committed
    """ convert a t tuple to date and ampm
Yang's avatar
Yang committed
    Parameters
    ----------
    t : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'

    Returns
    -------
    d : datetime date
        date
    ampm : str, 'AM'|'PM'
        ampm indicator
Yang's avatar
Yang committed
    """
Yang's avatar
Yang committed
    from datetime import date

Yang's avatar
Yang committed
    d = date(*t[:-1])  # current date, datetime date
    ampm = t[-1]  # current ampm, 'AM'|'PM'
Yang's avatar
Yang committed

    return d, ampm

Yang's avatar
Yang committed
def t2dt(t):
Yang's avatar
Yang committed
    """ convert a t tuple to datetime
Yang's avatar
Yang committed
    Parameters
    ----------
    t : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'

    Returns
    -------
    dt : datetime datetime
        datetime
Yang's avatar
Yang committed
    """
Yang's avatar
Yang committed
    from datetime import datetime

Yang's avatar
Yang committed
    dlh = {"AM": 0, "PM": 12}
    dhl = {0: "AM", 12: "PM"}

    dt = datetime(*t[:-1], dlh[t[-1]])
Yang's avatar
Yang committed

    return dt

Yang's avatar
Yang committed

def d2t(year, month, day, ampm):
    """ convert year, month, day, ampm to a t tuple
Yang's avatar
Yang committed
    Parameters
    ----------
    year : int
        year
    month : int
        month
    day : int
        day
    ampm : str, 'AM'|'PM'
        ampm indicator

    Returns
    -------
    t : list, (int,int,int,str)
        the year, month, day and 'AM'|'PM'
Yang's avatar
Yang committed
    """
    t = [year, month, day, ampm]
Yang's avatar
Yang committed
    return t

Yang's avatar
Yang committed
def dt2t(dt):
Yang's avatar
Yang committed
    """ convert datetime to a t tuple
Yang's avatar
Yang committed
    Parameters
    ----------
    dt : datetime datetime
        datetime
    Returns
    -------
    t : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'
Yang's avatar
Yang committed
    """
    dlh = {"AM": 0, "PM": 12}
    dhl = {0: "AM", 12: "PM"}
Yang's avatar
Yang committed

Yang's avatar
Yang committed
    t = [dt.year, dt.month, dt.day, dhl[dt.hour]]
Yang's avatar
Yang committed
    return t

Yang's avatar
Yang committed

def ftrange(firstday, lastday):
    """ get datetime range for given first and last t tuples (both ends included)
Yang's avatar
Yang committed

    Parameters
    ----------
    firstday : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'
    lastday : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'

    Returns
    -------
    trange : pandas date range
        date range defined by firstday and lastday
Yang's avatar
Yang committed
    """
Yang's avatar
Yang committed
    import pandas as pd

Yang's avatar
Yang committed
    trange = pd.date_range(t2dt(firstday), t2dt(lastday), freq="12h")
Yang's avatar
Yang committed
    return trange

Yang's avatar
Yang committed
def isyearst(t):
Yang's avatar
Yang committed
    """ determine if this time step is a new year start
Yang's avatar
Yang committed

    Parameters
    ----------
    t : tuple, (int,int,int,str)
        the year, month, day and 'AM'|'PM'

    Returns
    -------
    Ture: at new year start
    False: not at new year start
Yang's avatar
Yang committed
    """
    if (t[1] == 1) & (t[2] == 1) & (t[3] == "AM"):
Yang's avatar
Yang committed
        return True
    else:
        return False