B
    Qa_5                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ dd Z	dd Z
dd Zd	d
 Zdd Zd*ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd+ddZdd  Zd!d" Zd,d&d'Zd(d) ZdS )-    N)progressBarc             C   s2  t | tr| d } y| d} W n   Y nX d}ttd| dkrLd}nttd| dkrfd}nttd| dkrd	}nttd
| dkrd}nttd| dkrd}nzttd| dkrd}n`ttd| dkrd}nFttd| dkrd}n*ttd| dkr d}ntd| |S )a~  Get the datetime string format as defined in:
    https://docs.python.org/3.7/library/datetime.html#strftime-and-strptime-behavior

    Parameters: date_str - str, date in one of the following formats:
                            YYYYMMDDTHHMM
                            YYYYMMDD
                            YYMMDD
    Returns:    date_str_format - str, datetime string format
    r   utf8Nz#\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}z%Y-%m-%dT%H:%M:%Sz\d{4}-\d{2}-\d{2}T\d{2}:\d{2}z%Y-%m-%dT%H:%Mz\d{4}-\d{2}-\d{2}T\d{2}z%Y-%m-%dT%Hz\d{4}-\d{2}-\d{2}Tz%Y-%m-%dz\d{8}T\d{6}z%Y%m%dT%H%M%Sz\d{8}T\d{4}z%Y%m%dT%H%Mz\d{6}T\d{4}z%y%m%dT%H%Mz\d{8}z%Y%m%dz\d{6}z%y%m%dz*un-recognized date string format for "{}"!)
isinstancelistdecodelenrefindall
ValueErrorformat)date_strdate_str_format r   H/home/centos/operations/rsmas_insar/sources/MintPy/mintpy/utils/ptime.pyget_date_str_format   s6    

r   c             C   s*   | }|j dkr|tjdd7 }|jddS )zRound datetime object to the nearest second.
    Link: https://stackoverflow.com/questions/47792242/rounding-time-off-to-the-nearest-second-python
    g    A   )secondsr   )microsecond)r   dt	timedeltareplace)Zdatetime_objZdatetime_obj_outr   r   r   round_secondsF   s    
r   c             C   sZ   t | } tj| d j}d}|dk s0|dkr6d}n |dk rDd}n|dk rRd	}nd
}|S )zDetermine the season of input date in YYYYMMDD format

    Parameters: date_str - str, date in YYYYMMDD format
    Returns:    season   - str, season in ['WINTER', 'SPRING', 'SUMMER', 'FALL']
    z%Y%m%dN<   iJ  ZWINTER   ZSPRING   ZSUMMERZFALL)yyyymmddr   datetimestrptime	timetupletm_yday)r   ydayZseasonr   r   r   yyyymmdd2seasonP   s    r!   c             C   s,   t jt| t j| d d t jdd S )zConvert Matlab datenum into Python datetime.
    Parameters: datenum : Date in datenum format, i.e. 731763.5
    Returns:    datetime: Date in datetime.datetime format, datetime.datetime(2003, 7, 1, 12, 0)
    r   )daysin  )r   r   fromordinalintr   )Zdatenumr   r   r   datenum2datetimeg   s    r%   c             C   sj   dd }t | ttjtjtfr(|| }n>t | trTg }x.| D ]}||| q<W ntd	t
| |S )zread date in 2002.40657084 to datetime format
    Parameters: years    : (list of) float or str for years
    Returns:    years_dt : (list of) datetime.datetime objects
    c             S   sn   t | } t| t}t| | d td }d||}ytj|d}W n   t	d| Y nX |S )Ng     v@r   z	{:d}-{:d}z%Y-%jzwrong format: )
floatnpfloorastyper$   r   r   r   r   r
   )xyearr    x2Zxtr   r   r   decimal_year2datetime1v   s    z5decimal_year2datetime.<locals>.decimal_year2datetime1zAunrecognized input format: {}. Only float/str/list are supported.)r   r&   r'   float32float64strr   appendr
   r   type)yearsr-   Zyears_dtr+   r   r   r   decimal_year2datetimeq   s    


r4   c             C   s   t | tr| g}nt| }t|d }g }xv|D ]n}tj||}|j| j	d d  |j
d  |jd  |jd  }|rd|kr|t|d 7 }|| q0W t | tr|d }|S )a  Convert date(s) string into float number in the unit of year
    Parameters: dates   - (list of) str, date in YYYYMMDD format
                seconds - float or str, time of the day info in seconds
    Returns:    years   - (list of) float, years including the date and time info
    r   r   g     v@g     @g     Ag    ~~AT)r   r0   r   r   r   r   r   r+   r   r   hourminutesecondr&   r1   )datesr   	date_listdate_formatr3   r   dyr   r   r   yyyymmdd2years   s    

*
r>   c             C   s"   | d dkrd|  } nd|  } | S )z/Convert date str from YYMMDD to YYYYMMDD formatr   91920r   )dater   r   r   yymmdd2yyyymmdd   s    
rC   c             C   s"   | d dkrd|  } nd|  } | S )z'Convert year str from YY to YYYY formatr   r?   r@   rA   r   )r+   r   r   r   yy2yyyy   s    
rD   c             C   s~   t | tr0t| dd dkr*t| }qz| }nJt | trvg }x:| D ],}t|dd dkrft|}|| qDW ndS |S )zAConvert date str from (YY)YYMMDD(THHMM) to YYYYMMDD(THHMM) formatr5   r      N)r   r0   r   splitrC   r   r1   )r9   datesOutrB   r   r   r   r      s    



r   c             C   sr   t | tr*t| dkr$| dd }qn| }nDt | trjg }x4| D ]&}t|dkrZ|dd }|| q>W ndS |S )z/Convert date str in (YY)YYMMDD to YYMMDD format      N)r   r0   r   r   r1   )r9   rG   rB   r   r   r   yymmdd   s    


rJ   c             C   s<   t dd | D }t dd | D }dd t||D } | S )z,Convert date12 into YYYYMMDD_YYYYMMDD formatc             S   s"   g | ]}| d ddd qS )-_r   )r   rF   ).0ir   r   r   
<listcomp>   s    z#yyyymmdd_date12.<locals>.<listcomp>c             S   s"   g | ]}| d ddd qS )rK   rL   r   )r   rF   )rM   rN   r   r   r   rO      s    c             S   s   g | ]\}}d  ||qS )z{}_{})r   )rM   msr   r   r   rO      s    )r   zip)date12_listm_datess_datesr   r   r   yyyymmdd_date12   s    rV   c             C   s<   t dd | D }t dd | D }dd t||D } | S )z(Convert date12 into YYMMDD-YYMMDD formatc             S   s"   g | ]}| d ddd qS )rK   rL   r   )r   rF   )rM   rN   r   r   r   rO      s    z!yymmdd_date12.<locals>.<listcomp>c             S   s"   g | ]}| d ddd qS )rK   rL   r   )r   rF   )rM   rN   r   r   r   rO      s    c             S   s   g | ]\}}d  ||qS )z{}-{})r   )rM   rP   rQ   r   r   r   rO      s    )rJ   rR   )rS   rT   rU   r   r   r   yymmdd_date12   s    rW   c          	   C   sB   g }t j| r>t| d}|  }W dQ R X tt|}|S )zRead Date List from txt filerN)ospathisfileopenread
splitlinessortedr   )Z	date_filer:   fr   r   r   read_date_txt   s    ra   c             C   s   | sg S t | tr| g} g }xB| D ]:}|drNtj|r\t|}||7 }q"|g}||7 }q"W ttt	t
|}|rtt	t
||}|S )zRead Date List
    Parameters: date_list_in  : list of str / text file
                date_list_all : list of str in YYYYMMDD format
    Returns:    date_list_out : list of str in YYYYMMDD format
    )z.txtz.cfgz.dat)r   r0   endswithrY   rZ   r[   ra   r_   r   r   setintersection)Zdate_list_inZdate_list_allZdate_list_outr<   dsr   r   r   read_date_list  s     



rf   c       	         s   t | } tt|   fdd| D }g }x2|D ]*}||d  }|j|jd  }|| q0W i }x t| D ]\}}|| ||< qlW ||fS )ak  Get temporal Baseline in days with respect to the 1st date
    Parameters: date_list - list of string, date in YYYYMMDD or YYMMDD format
    Returns:    tbase     - list of int, temporal baseline in days
                dateDict  - dict with key   - string, date in YYYYMMDD format
                                      value - int, temporal baseline in days
    c                s   g | ]}t j| qS r   )r   r   r   )rM   rN   )r;   r   r   rO   7  s    z#date_list2tbase.<locals>.<listcomp>r   iQ )r   r   r0   r"   r   r1   	enumerate)	r:   r9   tbaserB   Z
date_deltaZtbase_iZdateDictrN   r   r   )r;   r   date_list2tbase-  s    
ri   c                s   t | } tt|   fdd| D }g }xL|D ]D}|j| jd d  |jd  |jd  |jd  }|	| q0W ||fS )aK  Get time in datetime format: datetime.datetime(2006, 5, 26, 0, 0)
    Parameters: date_list  - list of string, date in YYYYMMDD or YYMMDD format
    Returns:    dates      - list of datetime.datetime objects, i.e. datetime.datetime(2010, 10, 20, 0, 0)
                datevector - list of float, years, i.e. 2010.8020547945205
    c                s   g | ]}t j| qS r   )r   r   r   )rM   rN   )r;   r   r   rO   P  s    z$date_list2vector.<locals>.<listcomp>r   g     v@g     @g     Ag    ~~A)
r   r   r0   r+   r   r   r6   r7   r8   r1   )r:   r9   Z
datevectorr<   Zdate_vecr   )r;   r   date_list2vectorH  s    
*rj   r   D%Y%m%dc                sv   t | }ttj| | }ttj|| }t||}tj||| |dd	d}	 fdd|	D }
|
S )a  Make a list of dates with one-day (or given days) interval for [dmin, dmax]
    Parameters: dmin    - str in format supported by get_date_str_format()
                dmax    - str in format supported by get_date_str_format()
                dstep   - int, interval in number of dunit
                dunit   - str, unit of interval, e.g. Y, M, W, D, h, m, s
                out_fmt - str, output datetime string format
    Returns:    dt_list - list of str in YYYYMMDD format
    
datetime64)dtypeOc                s   g | ]}|  qS r   )strftime)rM   obj)out_fmtr   r   rO   p  s    z"get_date_range.<locals>.<listcomp>)
r   r'   rm   r   r   r   	isoformattimedelta64aranger)   )ZdminZdmaxZdstepZdunitrr   r   t1t2ZtstepZdt_objsZdt_listr   )rr   r   get_date_range_  s    
rx   c             C   s  ddl m}m}m} | jd dkrD| jd dkrD| jd dkrDd}nd}d| | |  jd	 t| jd
 d   }ddd||  d||  d|d|   d|d|    }|d|  }| jd | j	 | j
d  | }	tj|  tdtj|	d }
|
S )a  Convert UTC time to solar local time.
    Solar time: https://en.wikipedia.org/wiki/Solar_time
    Link: https://stackoverflow.com/questions/13314626

    Parameters: utc_time   - datetime.datetime object for the UTC time
                longitude  - float, longitude of the observer in degrees
    Returns:    solar_time - datetime.datetime object for the local solar time
    Example:    utc_time = dt.datetime(2015, 2, 9, 3, 18, 48)
                solar_time = ptime.utc2solar_time(utc_time, 130.7)
    r   )picossin   d   i  in  im  rI   r         g(\¥l@ga2U0*?gY+^?gmWel?g?x?g-&(?r   )Zminutes)mathry   rz   r{   r+   r   r   r&   r6   r7   r8   r   r   combinerB   timer   )Zutc_time	longitudery   rz   r{   Zyear_lengammaZeqtimeZtime_offsetZtstZ
solar_timer   r   r   utc2solar_timeu  s    *,>$r   )r   )N)r   rk   rl   )rY   r   r   r   r   numpyr'   Zmintpy.objects.progressr   r   r   r!   r%   r4   r>   rC   rD   r   rJ   rV   rW   ra   rf   ri   rj   rx   r   r   r   r   r   <module>	   s.   4


%			
 
