
    ZfJ                         d Z ddlZddlZddlZddlZddlmZ d Z	d Z
d Zd Zd Zd	 Zd
 ZddZd Zd Zd Zd Zd Zd Zd Zd ZddZddZddZddZddZd Zy)z#Utilities for date/time operations.    N)progressBarc                     t        | t              r| d   n| } t        |       }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd	      }|S )
zGet the "compact-looking" isoformat of the input datetime string.
    Parameters: date_str   - str, an example date string
    Returns:    iso_format - str, date string in "compact" iso format
    r   yY%Y%m%d%Y-%m-%dz%H%M%Sz%H:%M:%Sz%H%Mz%H:%M)
isinstancelistget_date_str_formatreplace)date_str
iso_formats     K/home/exouser/operations/rsmas_insar/tools/MintPy/src/mintpy/utils/ptime.pyget_compact_isoformatr      sp    
 )48x{hH$X.J##C-J##Hj9J##Hj9J##Fg6J    c                 ~   t        | t              r| d   n| } 	 | j                  d      } d}t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd	}|S t        t	        j
                  d
|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        t	        j
                  d|             dkD  rd}|S t        d|  d      #  Y xY w)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}r   z\d{8}:\d{6}z%Y%m%d:%H%M%Sz\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}r   z\d{6}z%y%m%dz&un-recognized date string format for "z"!)r	   r
   decodelenrefindall
ValueError)r   date_str_formats     r   r   r   "   s    )48x{hH??6* O
2::<hGH1L-@ = 
RZZ8(C	Dq	H*: 7 
RZZ2H=	>	B'4 1 
RZZ,h7	81	<$. + 
RZZ1	2Q	6)( % 
RZZ1	2Q	6)"  
RZZ1	2Q	6'  
RZZ1	2Q	6'  
RZZ(+	,q	0"  
RZZ(+	,q	0"
  A(2NOOGs   F7 7F<c                    g d}d}| j                  t        j                        ddd   }|D ]J  }|D ]?  }t        t	        j
                  ||            dkD  s&t	        j
                  ||      d   } n |sJ n |st        d|  d      |S )zGet date12 str from a given file path.

    Parameters: file_path  - str, path to a file that contains date1/2 info
    Returns:    date12_str - str, date12 in (YY)YYMMDD(THHMM)[-_](YY)YYMMDD(THHMM) format
    )z\d{8}T\d{4}[-_]\d{8}T\d{4}z\d{8}[-_]\d{8}z\d{6}[-_]\d{6}Nr   zNO date12 str found in path: !)splitossepr   r   r   r   )	file_pathdate12_fmts
date12_strpartspart
date12_fmts         r   get_date12_from_pathr&   X   s    K JOOBFF#DbD)E % 	J2::j$/014ZZ
D9!<
	  81EFFr   c                 z    | }|j                   dk\  r|t        j                  d      z  }|j                  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	timedeltar   )datetime_objdatetime_obj_outs     r   round_secondsr0   y   s@     $##s*BLL33###22r   c                     t        |       } t        j                  j                  | d      j	                         j
                  }d}|dk  s|dkD  rd}|S |dk  rd}|S |dk  rd	}|S 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']
    r   N<   iJ  WINTER   SPRING   SUMMERFALL)yyyymmddr,   datetimestrptime	timetupletm_yday)r   ydayseasons      r   yyyymmdd2seasonr@      s     !H;;(3==?GGD FbyD3J M 

 M	 
 M Mr   c                     t         j                  j                  t        |             t        j                  | dz        z   t        j                  d      z
  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(   daysn  )r,   r:   fromordinalintr-   )datenums    r   datenum2datetimerH      sE    
 ;;""3w<0\\w{+,\\s#$ $r   c                    d }t        | t        t        j                  t        j                  t
        f      r
 ||       }|S t        | t              r"g }| D ]  }|j                   ||              |S t        dt        |        d      )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                 D   t        |       } t        j                  |       j                  t              }t        j                  | |z
  dz        j                  t              dz   }|dd|d}	 t
        j                  j                  |d      }|S #  t        d|       xY w)N     v@r(   d-z%Y-%jzwrong format: )	floatnpfloorastyperF   r,   r:   r;   r   )xyearr>   x2xts        r   decimal_year2datetime1z5decimal_year2datetime.<locals>.decimal_year2datetime1   s    !Hxx{!!#&xxTV+,33C81<Qxqa!	1%%b'2B 		1-a00s   / B Bzunrecognized input format: z$. Only float/str/list are supported.)
r	   rN   rO   float32float64strr
   appendr   type)yearsrV   years_dtrS   s       r   decimal_year2datetimer^      s    
	 %%RZZ=>)%0 O 
E4	  	:DOO2489	:
 O 6tE{mCghiir   c                    t        | t              r| g}nt        |       }t        |d         }g }|D ]  }t        j
                  j                  ||      }|j                  |j                         j                  dz
  dz  z   |j                  dz  z   |j                  dz  z   |j                  dz  z   }|rd|vr|t        |      dz  z  }|j                  |        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(   rK        @     A    ~~AT)r	   rY   r
   r   r,   r:   r;   rS   r<   r=   hourminutesecondrN   rZ   )datesr*   	date_listdate_formatr\   r   rL   r   s           r   yyyymmdd2yearsrj      s     %G	K	%il3KE KK  ;7VVq{{},,q0F::VV{#$XX)*+ XX./0 s+-w#899AQ %aLr   c                 .    | d   dk(  rd| z   } | S d| z   } | S )z/Convert date str from YYMMDD to YYYYMMDD formatr   91920 )dates    r   yymmdd2yyyymmddrq      -    Aw#~Dy K DyKr   c                    t        | t              r]| dd | dd }}t        j                  t	        |      dd      t        j
                  t	        |            z   }|j                  d      }|S t        | t              rug }| D ]l  }|dd |dd }}t        j                  t	        |      dd      t        j
                  t	        |            z   }|j                  |j                  d             n |S y)zConvert GMTSAR folder name in YYYYDDD into YYYYMMDD.
    Parameters: date_in  - str/list, GMTSAR date format in YYYYDDD, where DDD is the day of year - 1
    Returns:    date_out - str/list, date in YYYYMMDD format
    N   r(   rB   r   )	r	   rY   r,   r:   rF   r-   strftimer
   rZ   )date_inrS   doydt_objdate_outr   s         r   yyyyddd2yyyymmddr{      s    
 '3BQKcSY1-#c(0KK??8, O 
GT	" 	7H !hrsm#D[[TAq1BLLc#h4OOFOOFOOH56	7 O r   c                 .    | d   dk(  rd| z   } | S d| z   } | S )z'Convert year str from YY to YYYY formatr   rl   rm   rn   ro   )rS   s    r   yy2yyyyr}     rr   r   c                 4   t        | t              r1t        | j                  d      d         dk(  rt	        |       }|S | }|S t        | t
              rGg }| D ]>  }t        |j                  d      d         dk(  rt	        |      }|j                  |       @ |S y)zAConvert date str from (YY)YYMMDD(THHMM) to YYYYMMDD(THHMM) formatrc   r      N)r	   rY   r   r   rq   r
   rZ   rg   datesOutrp   s      r   r9   r9     s    %u{{3"#q(&u-H O H O 
E4	  	"D4::c?1%&!+&t,OOD!	" O r   c                     t        | t              rt        |       dk(  r| dd }|S | }|S t        | t              r/g }| D ]&  }t        |      dk(  r|dd }|j	                  |       ( |S y)z/Convert date str in (YY)YYMMDD to YYMMDD format      N)r	   rY   r   r
   rZ   r   s      r   yymmddr   #  s    %u:?QqzH O H O 
E4	  	"D4yA~AayOOD!	" O r   c           	         t        | t              r| g}nt        |       }t        |D cg c]&  }|j	                  dd      j                  d      d   ( c}      }t        |D cg c]&  }|j	                  dd      j                  d      d   ( c}      }t        ||      D cg c]  \  }}| d|  }}}t        | t              r|d   }|S c c}w c c}w c c}}w )zConvert date12 into YYYYMMDD_YYYYMMDD format
    Parameters: date12_list_in  - (list of) str
    Returns:    date12_list_out - (list of) str in YYYYMMDD_YYYYMMDD format
    rM   _r   r(   )r	   rY   r
   r9   r   r   zipdate12_list_indate12_listim_datess_datesmsdate12_list_outs           r   yyyymmdd_date12r   7  s     .#&%&>* ;Oa		#s+11#6q9OPG;Oa		#s+11#6q9OPG.1'7.CDda!AaSzDOD .#&)!, POD   +C$+C%Cc           	         t        | t              r| g}nt        |       }t        |D cg c]&  }|j	                  dd      j                  d      d   ( c}      }t        |D cg c]&  }|j	                  dd      j                  d      d   ( c}      }t        ||      D cg c]  \  }}| d|  }}}t        | t              r|d   }|S c c}w c c}w c c}}w )zConvert date12 into YYMMDD-YYMMDD format
    Parameters: date12_list_in  - (list of) str
    Returns:    date12_list_out - (list of) str in YYMMDD-YYMMDD format
    rM   r   r   r(   )r	   rY   r
   r   r   r   r   r   s           r   yymmdd_date12r   N  s     .#&%&>* MAaiiS)//4Q7MNGMAaiiS)//4Q7MNG.1'7.CDda!AaSzDOD .#&)!, NMDr   c                    g }t         j                  j                  |       rXt        |       5 }|j	                         j                         }ddd       |D cg c]  }|s|	 }}t        t        |            }|S # 1 sw Y   1xY wc c}w )zRead Date List from txt fileN)r   pathisfileopenread
splitlinessortedr9   )	date_filerh   frR   s       r   read_date_txtr   f  s}     I	ww~~i )_ 	.++-I	. !*/1QQ/	/ 8I./		. 	. 0s   A<B B<Bc           	         | sg S t        | t              r| g} g }| D ]L  }|j                  d      r1t        j                  j                  |      s4t        |      }||z  }E|g}||z  }N t        t        t        t        |                        }|r,t        t        t        |      j                  |                  }|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	   rY   endswithr   r   r   r   r   r9   r
   setintersection)date_list_indate_list_alldate_list_outrL   dss        r   read_date_listr   w  s     		L#	&$~ M  ::,-ww~~a "1%# BRM  8D]);$<=>M tC$6$C$CM$RSTr   c                 4   t        |       }g }|r'|t        t        |      |       z  }t        d|        |r`t        d|        t        t	        |            }t        ||       D ]/  \  }}||k  s||vst        d|        |j                  |       1 |r`t        d|        t        t	        |            }	t        ||       D ]/  \  }}||	kD  s||vst        d|        |j                  |       1 t        t        t        |                  }|S )a  Get exclude date list from input options (start/end/ex_date).

    Parameters: date_list    - list of str, all dates in YYYYMMDD(THHMM) format
                start_date   - str, starting date
                end_date     - str, ending date
                exclude_date - list of str, exclude date in YYYYMMDD or text file
    Returns:    ex_date_list - list of str, exclude date
    )r   zexclude date: zstart   date: z  remove date: zend     date: )	rj   r   r
   printr9   r   rZ   r   r   )
rh   
start_dateend_dateexclude_date	year_listex_date_listyear_minrS   r   year_maxs
             r   get_exclude_date_listr     s)    y)IL tL'9SS|n-. zl+,!(:"67!)Y7 	.ND(h8<#?z23##H-	. xj)*!(8"45!)Y7 	.ND(h8<#?z23##H-	.
 $s<012Lr   c                    t        |       } |r|n| d   }t        |      }t        t        |             }| D cg c]"  }t        j                  j                  ||      $ }}t        j                  j                  |t        |            }g }|D ]2  }||z
  }|j                  |j                  |j                  dz  z          4 i }	t        |       D ]  \  }}
||   |	|
<    ||	fS c c}w )a  Get temporal Baseline in days with respect to the 1st date
    Parameters: date_list - list(str), date in YYYYMMDD or YYMMDD format
                ref_date  - str, reference date in YYYYMMDD format
    Returns:    tbase     - list(int), temporal baseline in days
                dateDict  - dict with key   - string, date in YYYYMMDD format
                                      value - int, temporal baseline in days
    r   iQ )
r9   r   rY   r,   r:   r;   rZ   rC   r*   	enumerate)rh   ref_datedt_fmtr   dt_listref_dttbasedt_idelta_dtdateDictr   s              r   date_list2tbaser     s     #I#x1H!H !Y0F8AB1r{{##Av.BGB[[!!(,?,IJF E H&=X]]X%5%5%FFGH
 H + &8"1X&(? Cs   'C$c           	         t        |       } t        t        |             }| D cg c]"  }t        j                  j                  ||      $ }}|r3d|vr/|D cg c]$  }|t        j                  t        |            z   & }}g }|D ]p  }|j                  |j                         j                  dz
  dz  z   |j                  dz  z   |j                  dz  z   |j                  dz  z   }|j                  |       r ||fS c c}w c c}w )a  Get time in datetime format: datetime.datetime(2006, 5, 26, 0, 0)

    Parameters: date_list  - list of string, date in YYYYMMDD or YYMMDD format
                seconds    - float, float or str, acquisition time of the day info in seconds.
    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
    rc   r)   r(   rK   r`   ra   rb   )r9   r   rY   r,   r:   r;   r-   rN   rS   r<   r=   rd   re   rf   rZ   )	rh   r*   ri   r   rg   rR   
datevectorrL   date_vecs	            r   date_list2vectorr     s    #I%c)n5K;DEaR[[!!![1EEE
 3k)CHIaR\\%.99II J $FFakkm33a76AAFFk*+HH 012 HH 567 	(#$ *# F Js   'C=)Dc                    t        |       }t        j                  t        j                  j                  | |      j                               }t        j                  t        j                  j                  ||      j                               }t        j                  ||      }t        j                  |||z   |d      j                  d      }	|	D 
cg c]  }
|
j                  |       }}
|S c c}
w )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O)r   rO   r   r,   r:   r;   	isoformattimedelta64arangerQ   rv   )dmindmaxdstepdunitout_fmtr   t1t2tstepdt_objsobjr   s               r   get_date_ranger     s     *$/O	r{{++D/BLLN	OB	r{{++D/BLLN	OBNN5%(E iiBuHe<@GGLG078s||G$8G8N 9s   C/c                    ddl m}m}m} | j                  dz  dk(  r'| j                  dz  dk7  r| j                  dz  dk7  rd}nd}d|z  |z  | j                         j                  d	z
  t        | j                  d
z
        dz  z   z  }ddd ||      z  z   d ||      z  z
  d |d|z        z  z
  d |d|z        z  z
  z  }|d|z  z   }| j                  dz  | j                  z   | j                  dz  z   |z   }	t        j                  j                  | j                         t        j                  d            t        j                   |	      z   }
|
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   )cospisinrt   d   i  rD   im  r   r(         g(\¥l@ga2U0*?gY+^?gmWel?g?x?g-&(?r2   )minutes)mathr   r   r   rS   r<   r=   rN   rd   re   rf   r,   r:   combinerp   timer-   )utc_time	longituder   r   r   year_lengammaeqtimetime_offsettst
solar_times              r   utc2solar_timer     sP    "! }}qA(--#"5":x}}s?RVW?WFX!3!3!5!=!=!AE(--Z\J\D]`bDb!bcEx(SZ"77(SZ:OO#a%i.()+3c!e)n+DE FF
 1y=(K
--"
x
.21E
E
SC$$X]]_bggajABLLY\D]]Jr   )r   )N)NNN)r(   Dr   )__doc__r:   r,   r   r   numpyrO   mintpy.objects.progressr   r   r   r&   r0   r@   rH   r^   rj   rq   r{   r}   r9   r   r   r   r   r   r   r   r   r   r   ro   r   r   <module>r      s    )  	 	  /3lB3.$:"J.((.0">&V<>,r   