o ����q�g�7����������������������@���s����d�Z�ddlZddlmZ�ddlZ �dddddd d �Zd'dd �Zd(dd�Zd'dd�Zdd��Z d)dd�Z d)dd�Zd*dd�Zd*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�rtt|��|�S�d}d}t�||��}|rv|�d�dkr!d}t|�d��|�}|�d�}|dkr>|dkr<t|d �S�|}|d krGt|d�S�|dkrPt|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)����=/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/nfcens/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���sv��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�|d#<�|d�dk�r|S�t|d�|d��� ���}|d�jd k�r%|d�jd k�r%||d<�t|d!��|d<�t|d$��|d <�||d <�|S�)%N�custom�instance�nowz%Y%m%d�todayr7���r:���r���r8���Zlead_minutesr���� lead_hoursr�����������)r���r����offset_hoursr����offset�initr;���Zloop_byz9ERROR: Cannot specify both valid and init to time utility�da_initz<ERROR: Cannot specify both valid and da_init to time utilityz>ERROR: Need to specify valid, init, or da_init to time utilityz%Y%m%d%H%M%SZda_init_fmtZ valid_fmtZinit_fmtZALLZlead_stringr2����date� init_hourr1���) �copyrK����strftimer���r���r����datetime� timedelta�printrJ���r/���r���r���)Zinput_dict_preserveZout_dictZ input_dictZKEYS_TO_COPY�keyrU���Z lead_daysr/���r)���r)���r*����ti_calculate����s����� rd���)r���)r���N)N)r:���)TF)�__doc__r`����dateutil.relativedeltar���r"���r?���r ���r-���r0���r.���r9���r+���r<���r=���rB���rH���rJ���rd���r)���r)���r)���r*����<module>���s0���� 0 &