o

����q�g�7����������������������@���s����d�Z�ddlZddlmZ�ddlZ	�dddddd	d
�Zd'dd
�Zd(dd�Zd'dd�Zdd��Z	d)dd�Z
d)dd�Zd*dd�Zd*dd�Z
dd��Zdd ��Zd+d#d$�Zd%d&��ZdS�),z�
Program Name: time_util.py
Contact(s): George McCabe
Abstract:
History Log:  Initial version
Usage: Create a subclass
Parameters: None
Input Files: N/A
Output Files: N/A
�����N)�
relativedelta�year�month�day�hour�minute�second)�Y�m�d�H�M�Sr���c�����������������C���s����t�|�t�rtt|��|�S�d}d}t�||��}|rv|�d�dkr!d}t|�d��|�}|�d�}|dkr>|dkr<t|d	�S�|}|d
krGt|d�S�|dkrPt|d
�S�|dkrYt|d	�S�|dkrbt|d�S�|dkrkt|d�S�|dkrtt|d�S�dS�dS�)al��!Converts time values ending in Y, m, d, H, M, or S to relativedelta object
        Args:
          @param value time value optionally ending in Y,m,d,H,M,S
            Valid options match format 3600, 3600S, 60M, or 1H
          @param default_unit unit to assume if no letter is found at end of value
          @return relativedelta object containing offset time����z(-*)(\d+)([a-zA-Z]*)�-���������������r�����secondsr�����hoursr
�����minutesr���)�daysr
���)�monthsr	���)�yearsN)�
isinstance�int�get_relativedelta�str�re�match�groupr���)�value�default_unit�mult�regr#���Z
time_valueZ
unit_value��r)����A/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/global_ens/time_util.pyr ���$���s8���








�r ���c�����������������C���s���t�|�|�}t||�S�)a1��!Convert string of time (optionally ending with time letter, i.e. HMSyMD to seconds
        Args:
          @param value string to convert, i.e. 3M, 4H, 17
          @param default_unit units to apply if not specified at end of string
          @returns time in seconds if successfully parsed, None if not)r ����!ti_get_seconds_from_relativedelta)r%���r&����
valid_timeZrd_objr)���r)���r*����get_seconds_from_stringT���s���

r-���c�����������������C���s���t�|�|�}t|�S�)zb!Convert time string (3H, 4M, 7, etc.) to format expected by the MET
        tools ([H]HH[MM[SS]]))r-����seconds_to_met_time)Ztime_stringr&����
total_secondsr)���r)���r*����time_string_to_met_time]���s���
r0���c�����������������C���sf���t�|�d���d�}t�|�d�d���d�}t�|�d���d�}t|�dks+|dks+|dkr1||�|�S�|S�)N�<���r�����������00)r!����zfill�len)r/���Zseconds_time_stringZminutes_time_stringZhour_time_stringr)���r)���r*���r.���c���s���r.���c�����������������C���s2���t�|�|�}|du�rdS�|dk�r|�d��S�|d�S�)a[��! Get hours from relativedelta. Simply calls get seconds function and
         divides the result by 3600.

         @param lead relativedelta object to convert
         @param valid_time (optional) valid time required to convert values
          that contain months or years
         @returns integer value of hours or None if cannot compute
    Nr���r2���)r+���)�leadr,����lead_secondsr)���r)���r*����ti_get_hours_from_relativedeltap���s���
	r9���c�����������������C���s����t�|�t�sdS�|durt|||�������S�|�jdks|�jdkr!dS�d}|�jdkr/||�jd�7�}|�jdkr;||�jd�7�}|�jdkrG||�jd�7�}|�j	dkrQ||�j	7�}|S�)z�!Check relativedelta object contents and compute the total number of seconds
        in the time. Return None if years or months are set, because the exact number
        of seconds cannot be calculated without a relative timeNr���i�Q�r2���r1���)
r���r���r���r/���r���r���r���r���r���r���)r7���r,���r/���r)���r)���r*���r+�������s ���





r+����*c�����������������C���s*���t�|�t�r|�S�|dkrd�}n|}t|�|�S�)Nr:���)r���r���r+���)r7����validr,���r)���r)���r*����ti_get_seconds_from_lead����s���

r<���c�����������������C���s���t�|�|�}|d�u�rd�S�|d�S�)Nr2���)r<���)r7���r;���r8���r)���r)���r*����ti_get_hours_from_lead����s���
r=���c�����������������C���s���|r|�S�dt�|����d�S�)N� )�TIME_LETTER_TO_STRING)�letter�letter_onlyr)���r)���r*����get_time_suffix����s���rB���c�����������������C���s����|dkr|�j�}n*|dkr|�j}n"|dkr|�j}n|dkr |�j}n|dkr(|�j}n
|dkr0|�j}nd�S�|dkr8d�S�t|�}t||�}|��|���}|dkrV|rV|sV|�����d	�}|S�)
Nr	���r
���r���r���r
���r���r���r���zs )	r���r���r���r���r���r����absrB����strip)r7���r@����pluralrA���r%���Z	abs_value�suffix�outputr)���r)���r*����format_time_string����s*���
rH���TFc�����������������C���s����t�|�t�rtt|�d�|d�S�t�|�t�sdS�|�jdk�s3|�jdk�s3|�jdk�s3|�jdk�s3|�jdk�s3|�j	dk�r6d}nd}g�}t
���D�]}t|�|||�}|durP|�
|��q>|sb|rWdS�d|r^d	���S�d���S�d�|�}|���}|��|���S�)
z�!Check relativedelta object contents and create string representation
        of the highest unit available (year, then, month, day, hour, minute, second).
        This assumes that only one unit has been set in the objectr���)rE���Nr���r���r���Z0Hz0 hour�s)r���r����ti_get_lead_stringr���r���r���r���r���r���r���r?����keysrH����append�joinrD���)r7���rE���rA����negative�output_list�time_letterrG���r)���r)���r*���rJ�������s0���

(��
�
rJ���c�����������������C���sj��i�}|�����}ddg}d|���v�r|d�|d<�|d��d�|d<�|D�]}||���v�r/||�||<�q!d|���v�r[t|d�t�rD|d�|d<�na|d�dkrQ|d�|d<�nTt|d�d�|d<�nJd	|���v�rkt|d	�d�|d<�n:d
|���v�r{t|d
�d�|d<�n*d|���v�r�t|d��}d
}|dkr�|d�}|d�}t||d�|d<�ntd
d�|d<�d|���v�r�tj|d�d�|d<�nd|���v�r�tj|d�d�|d<�ntjd
d�|d<�d|���v�r�d|���v�r�d|���v�r�|d�dkr�|d=�n	|d�dkr�|d=�d|���v��r)|d�|d<�d|���v��rtd��d�S�|d�dk�rd|d<�n
|d�|d��|d<�d|d<�ngd|v��rO|d�|d<�|d�dk�r@d|d<�n
|d�|d��|d<�d|d<�nAd|���v��r�|d�|d<�d|���v��ritd��d�S�|d�|d��|d<�|d�dk�rd|d<�n|d�|d��|d<�ntd��d�S�|d�dk�r�|d�|d��|d<�|d��d�|d<�|d��d�|d<�|d�dk�r�|d��d�|d<�|d�dk�r�d|d <�nt	|d��|d <�t|d��
���|d<�t|d�d!��|d<�d|v��r�|d�|d"<�|d�dk�r�|S�t|d�|d���
���}|d�jd
k�r|d�jd
k�r||d<�t|d!��|d<�t|d#��|d
<�||d	<�|S�)$N�custom�instance�nowz%Y%m%d�todayr7���r:���r���r8���Zlead_minutesr����
lead_hoursr�����������)r���r����offset_hoursr����offset�initr;���Zloop_byz?FATAL ERROR: Cannot specify both valid and init to time utility�da_initzBFATAL ERROR: Cannot specify both valid and da_init to time utilityzDFATAL ERROR: Need to specify valid, init, or da_init to time utilityz%Y%m%d%H%M%SZda_init_fmtZ	valid_fmtZinit_fmtZALLZlead_stringr2����dater1���)
�copyrK����strftimer���r���r����datetime�	timedelta�printrJ���r/���r���r���)Zinput_dict_preserveZout_dictZ
input_dictZKEYS_TO_COPY�keyrU���Z	lead_daysr/���r)���r)���r*����ti_calculate����s�����







 rc���)r���)r���N)N)r:���)TF)�__doc__r_����dateutil.relativedeltar���r"���r?���r ���r-���r0���r.���r9���r+���r<���r=���rB���rH���rJ���rc���r)���r)���r)���r*����<module>���s0����
	
0
	


 

&