
    d                       d dl mZ d dlZd dlmZ d dlmZ d dlZd dl	Z
d dlZd dlmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZ d d	lm Z m!Z! d d
l"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. h dZ/ e0e/1                    ej2        j3                            Z4 e0e/          Z5 e0ej2        j3                  Z3 ej6        d          df ej6        d          7                    d          df ej6        d          7                    d          df ej6        d          8                    dd          dfd ej6        d          z   dfd ej6        d          z   dfd ej6        d          z   dfd ej6        d          z   dfddgdfdggdfddgdf ej9        d          dfdd gdfd ggdf ej6        d          df ej6        d dd          df ej6        d dd          d fd!d"d#gd$fd%d& ej:        d'          d(fd ej6        d          z   d)fd*d+d,d-gd.fgZ;d/  ee;e3          D             Z<d0 Z=e-ej>        ?                    d1          ej>        @                    g d2e<          dd5                                    ZAe-dd6            ZBdd7ZCe-dd8            ZDe-ej>        @                    d9e3          dd:                        ZEe-ej>        @                    d9e5          dd;                        ZFe-ej>        @                    d9e4          dd<                        ZGe-ej>        @                    d9e3          dd=                        ZHe-ej>        @                    d9e5          dd>                        ZIe-ej>        @                    d9e5          dd?                        ZJe-ej>        @                    d9e3          dd@                        ZKe-ej>        @                    d9e5          ddA                        ZLe-ej>        @                    d9e4          ddB                        ZMe-ej>        @                    dCg dD          ddE                        ZNe-ddF            ZOe-ddG            ZPe)e-ej>        @                    g dHejQ        gddIgfejQ        d gddIdJgfejQ        d dKgdg dLfg          ddM                                    ZRe-ddN            ZSdOdPdQdRdSdTdUdVZTej>        @                    dWeTU                                          ddX            ZVej>        @                    dYdZg e
jW        g d[          d\f e
jW        dId]g          d\f e
jW        dIg          d^fg          dd_            ZXd`d`gdafg dbdcfg dddafgZYe-ej>        @                    d9e5dedfgz             ej>        @                    dgeY          ddh                                    ZZej>        @                    g didjdU ej[        dK          fg dkdU ej9        g dldm          fdndT ej[        dK          fdodQ ej[        dK          fdpdP ej[        dK          fdqdO ej[        dK          fg drdejQ        d dKgfdsdtgdTd"dugfdIdUejQ        fdIdIgdUejQ        ejQ        gfg
          ddv            Z\ddwZ]ej>        @                    dxdZg e
j^        dydzg          dUf e
j^        dnd{g          dTf e
j^        d|d}ejQ        g          dSf e
j^        d~dg          dRfg          dd            Z_e-ej>        @                    ddZgg d          dd                        Z`ej>        @                    d9e4          dd            ZaddZbe-dd            Zc ejd        e4          d             Ze ejd                    d             Z2 ejd                    d             Zf ejd                    d             Zge-dd            Zhe-e.dd                        Zie-dd            Zje-e.dd                        Zkej>        @                    d eg            edKdg          g          dd            Zle.ej>        @                    d eg            edKdg          g          dd                        Zme-ej>        @                    dg d          dd                        ZnddZoddZpe-dd            Zqe-dd            Zrej>        @                    d9e3          dd            Zse-ej>        @                    d9e3          ej>        @                    dddg          dd                                    Zte-ej>        @                    d9e5          ej>        @                    dg d          dd                                    Zue-ej>        @                    d9e4          ej>        @                    dg d          dd                                    Zvej>        @                    d9e3          dd            Zwej>        @                    d9e3          ej>        @                    dddg          dd                        Zxej>        @                    d9e5          ej>        @                    dg d          dd                        Zye-ej>        @                    d9e4          dd                        Zzej>        @                    deT{                                          ej>        @                    deT|                                          ej>        @                    de
j}        eg          dd                                    Z~ej>        @                    deT|                                          dd            Ze-ej>        @                    dg d          dd                        Ze-dd            Zej>        @                    d9g d          dd            Ze-d             Ze-d             Zej>        @                    dej        ej        ej        ej        g          d             Ze-d             Ze-d             Zej>        @                    dddg          d             Ze-dd            Ze-dd            ZdS )    )annotationsN)	timedelta)product)OutOfBoundsDatetime)	DataArrayDatasetVariablecftime_rangecodingconventions	decode_cf)_encode_datetime_with_cftime_should_cftime_be_usedcftime_to_nptimedecode_cf_datetimeencode_cf_datetimeto_timedelta_unboxed)SerializationWarning)_update_bounds_attributes
cf_encoder)contains_cftime_datetimes)assert_equalassert_identical)FirstElementAccessibleArray	arm_xfailassert_array_equalassert_no_warnings
has_cftimerequires_cftimerequires_dask>   juliannoleap360_day365_day366_dayall_leap
   days since 2000-01-01float64float32      i0  zhours since 1680-01-01 00:00:00zhour since 1680-01-01  00:00:00zHour  since 1680-01-01 00:00:00z" Hour  since  1680-01-01 00:00:00 )r'   r(   zdaYs  since 2000-01-01)r   days since 1000-01-01r-   i i N  zdays since 1900-01-01zdays since 1-01-01)g   .MpAzhours since 1-1-1 00:00:0.0g      ?g      ?zhours since 1900-01-01T00:00:00)r   z&milliseconds since 2000-01-01T00:00:00)r   z&microseconds since 2000-01-01T00:00:00i@/zseconds since 1981-01-01z%hour since 1680-01-01 00:00:00.500000)i days since 1850-01-01 00:00:00)    Ar.   r/   g    DAr.   c                     g | ]\  }}||fz   S  r1   ).0num_dates_unitscalendars      >lib/python3.11/site-packages/xarray/tests/test_coding_times.py
<listcomp>r6   X   s3       ! xk!      c            	     p    dd l } | j        | j        | j        | j        | j        | j        | j        | j        dS )Nr   )r"   r$   r#   r!   r&   r%   	gregorianproleptic_gregorian)cftimeDatetimeNoLeapDatetime360DayDatetimeJulianDatetimeAllLeapDatetimeGregorianDatetimeProlepticGregorian)r;   s    r5   _all_cftime_date_typesrB   `   sL    MMM '(('*)-%@	 	 	r7   z&ignore:Ambiguous reference date string)	num_datesunitsr4   returnNonec                   dd l }|                    | ||d          }t          j        t          j        |                    t          j        |                    j        }t          j        t          j        |                    t          j        |                    j        }|dk    r|dk     rt          |          }t          j
                    5  t          j        dd           t          j                            | ||          }d d d            n# 1 swxY w Y   t          j        t!          ||z
                                                      }t#          j        |                                                                          }|t          j        dd	          k                                    sJ t          j                            |||          \  }	}
}
t1          | t          j        |	d                     t5          | d
          rk| j        dk    rbd|vr`t          j                            t#          j        |          ||          \  }	}
}
t1          | t          j        |	d                     d S d S d S d S )Nr   Tonly_use_cftime_datetimesi    ignoreUnable to decode time axis   sndim1000)r;   num2datenpravel
atleast_1d	nanargminyear	nanargmaxr   warningscatch_warningsfilterwarningsr   timesr   asarrayabspdto_timedeltatolistto_numpytimedelta64allr   r   aroundhasattrrO   Index)rC   rD   r4   r;   expectedmin_ymax_yactualabs_diffencoded_s              r5   test_cf_datetimern   o   s    MMM5(d   H HR]8,,--bl9.E.EFKEHR]8,,--bl9.E.EFKE}}#H--		 	"	" M M*FGGG00E8LLM M M M M M M M M M M M M M M z#fx/00117799Hx0011::<<H
 q#...3355555L33FE8LLMGQy")GQ"7"7888y&!! =in&9&9fE>Q>Q 77HVeX
 
A 	9bi&;&;<<<<<= =&9&9>Q>Qs   7DDDc                 X   ddl m}  | }d}d} |ddd           |dd	d          f}t          |          D ]s\  }}t          j                    5  t          j        d
d           t          j                            ||          }d d d            n# 1 swxY w Y   |||         k    sJ td S )Nr   )r@   days since 2000-01-01 00:00:00)i4i3v i        rJ      rK   rL   )	r;   r@   	enumeraterX   rY   rZ   r   r[   r   )r@   datetimerD   daysrg   idayresults           r5    test_decode_cf_datetime_overflowrz      s*   
 )((((( H,E Dr2&&q"(=(=>HD// % %3$&& 	A 	A#H.JKKK\44S%@@F	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A !$$$$$	% %s   6BB	B	c                     t          j        ddd          } d}t          j                            t          j        d          |          }t          ||            d S )Nd   z
1970-01-01hperiodsstartfreqzhours since 1-1-1970)r^   
date_ranger   r[   r   rR   aranger   )rg   rD   rj   s      r5   *test_decode_cf_datetime_non_standard_unitsr      sT    }S3GGGH #E\,,RYs^^UCCFvx(((((r7   c                    t          j        ddd          } t          j        d          dft          j        d          dft          j        d          dfg}|D ]i\  }}t          j                            ||          }t          || j        z
            }|t          j	        dd	          k    
                                sJ jd S )
Nr|   
2000-01-01r}   r~   zhours since 2000-01-01 0zhours since 2000-1-1 0zhours since 2000-01-01 0:00rM   rN   )r^   r   rR   r   r   r[   r   r]   valuesrb   rc   )rg   casesrC   rD   rj   rk   s         r5   'test_decode_cf_datetime_non_iso_stringsr      s     }S3GGGH	334	312	367E
 " : :	500EBBv/00 BN1c22277999999: :r7   r4   c                   dd l }d}t          j        ddd          }|                    |                                ||           }|j        }t          j        d          }t          j	        
                    |||           }|j        |k    sJ t          ||z
            }|t          j        d	d
          k                                    sJ d S )Nr   days since 0001-01-012001-04-01-002001-04-30-23Hendr   r4   M8[ns]rM   rN   )r;   r^   r   date2numto_pydatetimer   rR   dtyper   r[   r   r]   rb   rc   )	r4   r;   rD   r[   timerg   expected_dtyperj   rk   s	            r5   4test_decode_standard_calendar_inside_timestamp_ranger      s     MMM#EM/SIIIE??5..00%(?KKD|HXh''N\,,T58,LLF<>))))6H$%%H q#...335555555r7   c                   dd l }d}t          j        ddd          }|                    |                                ||           }|                    ||| d	          }t          j        d
          }t          j	        
                    |||           }|j        |k    sJ t          ||z
            }|t          j        dd          k                                    sJ d S )Nr   r   r   r   r   r   r   Tr4   rI   OrM   rN   )r;   r^   r   r   r   rQ   rR   r   r   r[   r   r]   rb   rc   )	r4   r;   rD   r[   non_standard_timerg   r   rj   rk   s	            r5   8test_decode_non_standard_calendar_inside_timestamp_ranger      s     MMM#EM/SIIIE(;(;(=(=uxXX58t   H Xc]]N\,,58 -  F <>))))6H$%%H q#...335555555r7   c                b  	 ddl m  dd l}d}fdt          dd          D             }|                    |||           }|                    ||| d	          }t          |d                   	t          j                    5  t          j        d
d           t          j
                            |||           }d d d            n# 1 swxY w Y   t          	fd|D                       sJ t          ||z
            }|t          j        dd          k                                    sJ d S )Nr   ru   r   c                ,    g | ]} d dd |          S rM   rs   r1   )r2   r}   ru   s     r5   r6   z=test_decode_dates_outside_timestamp_range.<locals>.<listcomp>   s)    777aXXaAq!!777r7   rM   r,   r   Tr   rK   rL   c              3  8   K   | ]}t          |          V  d S N)
isinstance)r2   valueexpected_date_types     r5   	<genexpr>z<test_decode_dates_outside_timestamp_range.<locals>.<genexpr>  s.      IIz%!344IIIIIIr7   rN   )ru   r;   ranger   rQ   typerX   rY   rZ   r   r[   r   rc   r]   rR   rb   )
r4   r;   rD   r[   r   rg   rj   rk   ru   r   s
           @@r5   )test_decode_dates_outside_timestamp_ranger      s    "!!!!!MMM#E77775A;;777E??5%(?;;Deh$   H hqk**		 	"	" Q Q*FGGG00ux0PPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q IIII&IIIIIIII6H$%%H q#...335555555s   8CCCc                "   d}ddgdggfD ]}t          j                    5  t          j        dd           t          j                            |||           }d d d            n# 1 swxY w Y   |j        t          j        d          k    sJ d S )Nr   8 rK   rL   r   r   rX   rY   rZ   r   r[   r   r   rR   r4   rD   num_timerj   s       r5   Ctest_decode_standard_calendar_single_element_inside_timestamp_ranger     s    
 $EfXz2 2 2$&& 	Y 	Y#H.JKKK\44Xux4XXF	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y |rx1111111	2 2   8A$$A(	+A(	c                "   d}ddgdggfD ]}t          j                    5  t          j        dd           t          j                            |||           }d d d            n# 1 swxY w Y   |j        t          j        d          k    sJ d S )Nr   r   rK   rL   r   r   r   r   s       r5   Gtest_decode_non_standard_calendar_single_element_inside_timestamp_ranger     s    
 $EfXz2 - -$&& 	Y 	Y#H.JKKK\44Xux4XXF	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y 	Y |rx}},,,,,	- -r   c                   dd l }d}dD ]}||g|ggfD ]}t          j                    5  t          j        dd           t          j                            |||           }d d d            n# 1 swxY w Y   |                    ||| d          }t          |	                                t          |                    sJ d S )	Nr   r   )rM   io rK   rL   r   TrH   )r;   rX   rY   rZ   r   r[   r   rQ   r   itemr   )r4   r;   rD   rv   r   rj   rg   s          r5   2test_decode_single_element_outside_timestamp_ranger   (  s3    MMM#E = =vx0 
	= 
	=H(**  '2NOOO88eh 9                 eX '  H fkkmmT(^^<<<<<<
	== =s   8A,,A03A0c                B   dd l }d}t          j        ddd          }t          j        ddd          }|                    |                                || 	          }|                    |                                || 	          }t          j        t          |          d
f          }||d d df<   ||d d df<   |j        }|j        }	t          j
                            ||| 	          }
|
j        t          j        d          k    sJ t          |
d d df         |z
            }t          |
d d df         |	z
            }|t          j        dd          k                                    sJ |t          j        dd          k                                    sJ d S )Nr   r   
2001-04-01
2001-04-05Dr   
2001-05-01
2001-05-05r   r+   rM   r   rN   )r;   r^   r   r   r   rR   emptylenr   r   r[   r   r   r]   rb   rc   )r4   r;   rD   times1times2time1time2	mdim_time	expected1	expected2rj   	abs_diff1	abs_diff2s                r5   Btest_decode_standard_calendar_multidim_time_inside_timestamp_ranger   <  s   
 MMM#E]<\DDDF]<\DDDFOOF0022EHOMMEOOF0022EHOMME#e**a))IIaaadOIaaadOII\,,Y,QQF<28H------F111a4L9,--IF111a4L9,--I 3///44666663///446666666r7   c                   dd l }d}t          j        ddd          }t          j        ddd          }|                    |                                || 	          }|                    |                                || 	          }t          j        t          |          d
f          }||d d df<   ||d d df<   |j        dk    r3|	                    ||| d          }|	                    ||| d          }	n.|	                    |||           }|	                    |||           }	t          j
        d          }
t          j                            ||| 	          }|j
        |
k    sJ t          |d d df         |z
            }t          |d d df         |	z
            }|t          j        dd          k                                    sJ |t          j        dd          k                                    sJ d S )Nr   r   r   r   r   r   r   r   r   r+   rM   r;   TrH   r   rN   )r;   r^   r   r   r   rR   r   r   __name__rQ   r   r   r[   r   r]   rb   rc   )r4   r;   rD   r   r   r   r   r   r   r   r   rj   r   r   s                 r5   Etest_decode_nonstandard_calendar_multidim_time_inside_timestamp_ranger   [  s   
 MMM#E]<\DDDF]<\DDDFOOF0022EHOMMEOOF0022EHOMME#e**a))IIaaadOIaaadO(""OO5(d $ 
 
	 OO5(d $ 
 
		 OOE5(;;	OOE5(;;	Xc]]N\,,Y,QQF<>))))F111a4L9,--IF111a4L9,--I 3///44666663///446666666r7   c                   ddl m  dd l}d}fdt          dd          D             }fdt          dd          D             }|                    |||           }|                    |||           }t	          j        t          |          d	f          }||d d df<   ||d d df<   |                    ||| d
          }|                    ||| d
          }	t          j	                    5  t          j
        dd           t          j                            |||           }
d d d            n# 1 swxY w Y   |
j        t	          j        d          k    sJ t          |
d d df         |z
            }t          |
d d df         |	z
            }|t	          j        dd          k                                    sJ |t	          j        dd          k                                    sJ d S )Nr   r   r   c                *    g | ]} d d|          S r   r1   r2   rx   ru   s     r5   r6   zEtest_decode_multidim_time_outside_timestamp_range.<locals>.<listcomp>  '    999chhq!S!!999r7   rM      c                *    g | ]} d d|          S )rM   r,   r1   r   s     r5   r6   zEtest_decode_multidim_time_outside_timestamp_range.<locals>.<listcomp>  r   r7   r   r+   TrH   rK   rL   r   rN   )ru   r;   r   r   rR   r   r   rQ   rX   rY   rZ   r   r[   r   r   r]   rb   rc   )r4   r;   rD   r   r   r   r   r   r   r   rj   r   r   ru   s                @r5   1test_decode_multidim_time_outside_timestamp_ranger     s\    "!!!!!MMM#E9999U1a[[999F9999U1a[[999FOOFEHO==EOOFEHO==E#e**a))IIaaadOIaaadOuhRVWWIuhRVWWI		 	"	" V V*FGGG00EH0UUV V V V V V V V V V V V V V V <28C==((((F111a4L9,--IF111a4L9,--I 3///44666663///446666666s   08D44D8;D8)r4   r   ))r#   g    t%A)r&       6W&A)r%   r   c                    dd l }d}t          j                            |||           }t	          j        |                    ||| d                    }|j        t	          j        d          k    sJ ||k    sJ d S )Nr   r   r   TrH   r   )r;   r   r[   r   rR   r\   rQ   r   )r4   r   r;   rD   rj   rg   s         r5   0test_decode_non_standard_calendar_single_elementr     s     MMM#E\,,Xux,PPFz%TRR H <28C==((((vr7   c                    dd l } d}dD ]}d| d}t          j        d          }|                     |||d          }t	          j        d	          5 }t	          j        d
           t          j        	                    |||          }t          |          dk    sJ 	 d d d            n# 1 swxY w Y   |j        t          j        d          k    sJ t          ||           d S )Nr   r#   )i  i  i  i  i  days since -01-01r|   TrH   )recordalwaysr   r   )r;   rR   r   rQ   rX   rY   simplefilterr   r[   r   r   r   r   )r;   r4   rV   rD   	num_timesrg   wrj   s           r5   test_decode_360_day_calendarr     sJ   MMMH. - -*d***IcNN	??uh$ # 
 
 $D111 	Q!(+++\4458 5  F q66Q;;;;;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 |rx}},,,,68,,,,!- -s   AB,,B0	3B0	c                    ddl } t          j        dg          }d}t          j                            ||          }t          j                            |                     ||                    }t          ||           dS )zFTest making sure we properly fall back to cftime on abbreviated units.r   Ng  _wBz msecs since 1970-01-01T00:00:00Z)	r;   rR   arrayr   r[   r   r   rQ   r   )r;   valrD   rj   rg   s        r5   test_decode_abbreviationr     st     MMM
(O$
%
%C.E\,,S%88F|,,V__S%-H-HIIHvx(((((r7   )rC   rD   expected_listNaT2000-01-01T00:00:00ZrM   )r   r   z2000-01-02T00:00:00Zc                6   t          j                    5  t          j        dd           t          j                            | |          }d d d            n# 1 swxY w Y   t          j        |                              d          }t          ||           d S )NrK   zAll-NaNdatetime64[ns]r   )
rX   rY   rZ   r   r[   r   r^   to_datetimera   r   )rC   rD   r   rj   rg   s        r5   test_cf_datetime_nanr     s     
	 	"	" C C)44400EBBC C C C C C C C C C C C C C C ~m,,55<L5MMHx(((((s   6AAAc                 z   t          dt          j        ddgddgg          ddi          } t          j                                                            |           }|j        dk    sJ t          j	        d	d
          j
                            dd          }t          t          j        |          |           d S )Nxyr   rM   r+      rD   r(   r   r   rs   r   )r	   rR   r   r   r[   CFDatetimeCoderdecoder   r^   r   r   reshaper   r\   )variablery   rg   s      r5   !test_decoded_cf_datetime_array_2dr     s     BHq!fq!f-..:Q0R H \))++228<<F<+++++}\1555<DDQJJHrz&))844444r7   nanosecondsmicrosecondsmillisecondssecondsminuteshoursrv   )NULSTr   r   )r   rD   c                    t          j        dd|           }| d}|t          j                            |          k    sJ d S )N2000r+   r   r   z since 2000-01-01 00:00:00)r^   r   r   r[   infer_datetime_units)r   rD   datesrg   s       r5   test_infer_datetime_unitsr    sM    M&!$777E333Hv|88????????r7   r  rg   )
1900-01-01z
1900-01-02r   zdays since 1900-01-01 00:00:00r  days since 1970-01-01 00:00:00c                P    |t           j                            |           k    sJ d S r   )r   r[   r  )r  rg   s     r5   "test_infer_datetime_units_with_NaTr
    s+     v|88????????r7   l  rM   rM   z%days since 1900-01-01 00:00:00.000000)r  )r  rM   r+   )r  rM   r+   r   r   rM   z(seconds since 1900-01-01 00:00:00.000000)r  )r  rM      )r  rM      r9   r:   )	date_argsrg   c                    t                      |          fd|D             }|t          j                            |          k    sJ d S )Nc                    g | ]} | S r1   r1   )r2   args	date_types     r5   r6   z4test_infer_cftime_datetime_units.<locals>.<listcomp>6  s     444$YY444r7   )rB   r   r[   r  )r4   r  rg   r  r  s       @r5    test_infer_cftime_datetime_unitsr  /  sU     '((2I4444)444Ev|88????????r7   )
timedeltasrD   numbers1Dr  2D3DrM   r+   r   int641h1ms1us1ns)r   0s1s30m60m      ?c                `   | dk    rt          j        dd          } nt          |           } t          j        |          }|}t          j                            | |          \  }}t          ||           |j        |j        k    sJ |D| }t          j        	                    ||          }t          ||           |j        |j        k    sJ t          j        dd          }t          j        	                    t          j        t           j
                  d          }t          ||           d S )Nr   nsrv   )rR   rb   r   r   r   r[   encode_cf_timedeltar   r   decode_cf_timedeltanan)r  rD   r  rg   rj   rm   s         r5   test_cf_timedeltar+  :  s     U^E400

)*55
hwGH00UCCIFAx(((>V\))))11'5AA8V,,,~----~eT**H\--bhrv.>.>GGFx(((((r7   c                    d} t          j        g d          }t          j        t          g d                    }|}t          j                            ||           }t          ||           |j        |j        k    sJ d S )Nrv   r  r  )rR   
atleast_2dr   r   r[   r)  r   r   )rD   r  r  rg   rj   s        r5   test_cf_timedelta_2dr.  `  s    EmIII&&G34F4F4FGGHHJH\--gu==Fx(((>V\))))))r7   deltasz1 dayz2 daysz1 day 1 hour1m2m1m3s1m4sc                P    |t           j                            |           k    sJ d S r   )r   r[   infer_timedelta_units)r/  rg   s     r5   test_infer_timedelta_unitsr6  l  s+     v|99&AAAAAAAAr7   r  )))rM   r+   r   rs   r,   r   z0001-02-03 04:05:06.000000))r'   r+   r   rs   r,   r   z0010-02-03 04:05:06.000000))r|   r+   r   rs   r,   r   z0100-02-03 04:05:06.000000))i  r+   r   rs   r,   r   z1000-02-03 04:05:06.000000c                    t                      }|                                D ],}t          j                             ||            }||k    sJ -d S r   )rB   r   r   r[   format_cftime_datetime)r  rg   
date_typesr  ry   s        r5   test_format_cftime_datetimer:  y  sd     ())J&&(( " "	44YY	5JKK!!!!!" "r7   c                   g d}t          ||gdgd          }|                                }dD ]"}d||         j        d<   | ||         j        d<   #t          sL| t          vrCt          j        t                    5  t          |          }d d d            d S # 1 swxY w Y   d S t          |          }| t          vr&|j	        j
        t          j
        d	          k    sJ d S |j	        j
        t          j
        d
          k    sJ d S )N)r%         @g      @r   testcoordsdimsname)r=  r   zdays since 2001-01-01rD   r4   r   r   )r   
to_datasetattrsr   _STANDARD_CALENDARSpytestraises
ValueErrorr   r=  r   rR   )r4   rv   dadsvs        r5   test_decode_cfrK    sW   ??D	4fXF	C	C	CB	B + +61G"*1J 	7(*===]:&& 	 	2B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 r]]...7=BHSMM1111117=BHX$6$6666666s   <BB Bc                    t          t          j        dd                              d          dg didd	          } d
ddd}|                                 }|d         j                            |           t          |j                   |j        d         j        d
ddk    sJ t          |          }|j
        j        t          j        d          k    sJ t          |d          }|j
        j        t          j        d          k    sJ |                                 }|d         j                            |           ddd}|d         j                            |           t          |j                   |j        d         j        |k    sJ |                                 }|d         j                            |           d|d         j        d<   t          |j                   d S )Nr   r  r   )r   r+   r   r  )r   nbnd	time_bndsr>  zdays since 2001-01standard)rD   r4   bounds)rD   r4   r   F)decode_timeszhours since 2001-01r"   fake_varrP  )r   rR   r   r   rB  rC  updater   	variablesr   rN  r   )rH  rC  rI  dscbnd_attrs        r5   test_decode_cf_time_boundsrW    s   	
	!7###++F33			"	
 
 
B & E 
BvJE"""bl+++<$*%/ /     B--C="(8"4"44444
BU
+
+
+C="(7"3"33333 
BvJE""".HEEH{O  ***bl+++<$*h6666 
BvJE"""!+BvJXbl+++++r7   c                    t          j        dd          } t          j        ddd          }t          t          | |                    d	d
ij        _        dddj        _        i }t          t          j	        ddg          d
g          |d
<   t          j        j                  \  }}t          |d
         |d
                    d|d
         j        vsJ d|d
         j        vsJ dddj        _        t          fdj        D             j                  \  }}t          |d
         |d
                    d|d
         j        vsJ d|d
         j        vsJ dddj        _        t          fdj        D             j                  \  }}t          j        t                     5  t          |d
         |d
                    d d d            n# 1 swxY w Y   d|d
         j        vsJ |d
         j        d         j        j        d         k    sJ i j        _        t          j        t$                    5  t          j        j                   d d d            d S # 1 swxY w Y   d S )Nz
2000-01-16rM   r   r   r+   MSr  )r   time_boundsrP  rZ  r"   r(   r4   rD   r   rr   )datar@  r4   rD   c                "    i | ]}||         S r1   r1   r2   krI  s     r5   
<dictcomp>z+test_encode_time_bounds.<locals>.<dictcomp>      <<<!Q1<<<r7   zdays since 1849-01-01c                "    i | ]}||         S r1   r1   r^  s     r5   r`  z+test_encode_time_bounds.<locals>.<dictcomp>  ra  r7   )r^   r   r   dictr   rC  encodingr	   rR   r   r   rT  r   rZ  rE  rF  AssertionErrorwarnsUserWarning)r   rZ  rg   rl   rm   rI  s        @r5   test_encode_time_boundsrh    s(   =q111D-adCCCK	4[999	:	:B}-BGM$,7NOOBGH&BHaW,=,=]OTTTH]BL"(33JGQ'-)@AAAW]399999'-066666 ,4>UVVBN<<<<r|<<<bhGGJGQ'-)@AAAW]399999'-066666 ,4>UVVBN<<<<r|<<<bhGGJGQ	~	&	& F FW]+Xm-DEEEF F F F F F F F F F F F F F FW]399999=!'0BN4KG4TTTTTBG	k	"	" + +2<***+ + + + + + + + + + + + + + + + + +s$   7G  G$'G$
I22I69I6)paramsc                    | j         S r   )param)requests    r5   r4   r4     s
    =r7   c                `    dd l }|                    t          j        d          d| d          S )Nr   rs   hours since 2000-01-01T)rD   r4   rI   )r;   rQ   rR   r   )r4   r;   s     r5   r[   r[     s:    MMM??
	!&"&	    r7   c                    t           j                            ddd          }t          j        ddd          }t          j        ddd          }t	          |||| gg dd          S )	Nr+   rs   r         lonlatr   r\  r>  )rR   randomrandlinspacer   )r[   r\  lonslatss       r5   r\  r\    sm    9>>!Q""D;q"a  D;q"a  DdD%(/E/E/EF   r7   c                    t          j        ddd          }t          j        ddd          }t           j                            | d          }t	          |||| gg dd	          S )
Nr   rp  r+   rq  )r+   r+   rs   )sizerr  r\  r>  )rR   rw  ru  choicer   )r[   rx  ry  	times_arrs       r5   times_3dr~    sq    ;q"a  D;q"a  D	  Y 77I4u-4J4J4JQW   r7   c                <    t          | j        j                  sJ d S r   )r   r   r   r\  s    r5   !test_contains_cftime_datetimes_1dr    s!    $TY%78888888r7   c                `    t          | j        j                                                  sJ d S r   )r   r   r   chunkr  s    r5   &test_contains_cftime_datetimes_dask_1dr    s/     %TY%7%=%=%?%?@@@@@@@r7   c                2    t          | j                  sJ d S r   r   r   r~  s    r5   !test_contains_cftime_datetimes_3dr     s    $X%67777777r7   c                V    t          | j                                                  sJ d S r   r   r   r  r  s    r5   &test_contains_cftime_datetimes_dask_3dr  %  s-     %X%6%<%<%>%>???????r7   non_cftime_datac                2    t          | j                  rJ d S r   r  r  s    r5   *test_contains_cftime_datetimes_non_cftimesr  +  s    ()ABBBBBBBr7   c                V    t          | j                                                  rJ d S r   r  r  s    r5   /test_contains_cftime_datetimes_non_cftimes_daskr  0  s-     ))A)G)G)I)IJJJJJJJr7   shape))   )r  r   )r+   rs   r   c                    t          j        dd          j                            |           }d}d}t	          |||          \  }}}t          |||          }t          j                            ||           d S )N2100r  r   zdays since 1800-01-01rO  )	r^   r   r   r   r   r   rR   testingr   )r  r  rD   r4   numrm   	roundtrips          r5    test_encode_cf_datetime_overflowr  6  sy     M&"---4<<UCCE#EH"5%::ICA"3x88IJ!!%33333r7   c                 D   t          j        dd          } t          j        t          d          5  t          | d           d d d            n# 1 swxY w Y   t          j        t          d          5  t          | d	           d d d            d S # 1 swxY w Y   d S )
Nr  r   r   zinvalid time unitsmatchzdays after 2000-01-01)rD   zinvalid reference datezdays since NO_YEAR)r^   r   rE  rF  rG  r   )r  s    r5   test_encode_expected_failuresr  C  s4   M&!,,,E	z)=	>	>	> A A5(?@@@@A A A A A A A A A A A A A A A	z)A	B	B	B > >5(<====> > > > > > > > > > > > > > > > > >s#   AAA6BBBc                     t          j        dd          } t          |           \  }}}t          j        g d          }d}d}t          j                            ||           ||k    sJ ||k    sJ d S )Nr  r   r   )g        r%  r<  rp   r:   )r^   r   r   rR   r   r  r   )r  r  rD   r4   expected_numexpected_unitsexpected_calendars          r5   "test_encode_cf_datetime_pandas_minr  K  s    M&!,,,E-e44C8OOO,,L5N-J!!#|444N""""(((((((r7   c                     t          t          j        dd          dd          \  } }}g d}d}d}t          | |           ||k    sJ ||k    sJ d S )Nr  r   r   z!days since 1970-01-01 00:00:00 00rO  )i*  i*  i*  )r   r^   r   r   )r  rD   r4   r  r  r  s         r5   3test_encode_cf_datetime_invalid_pandas_valid_cftimer  W  s    -
fa(((+	 C )((L8N"sL)))N""""(((((((r7   c                   d}t          j        g d          }t          |||           }t          |          j        j        }t          g d          }t          ||           t          |||           \  }}}| t          v r!t           j	        
                    ||           n t           j	                            ||           ||k    sJ || k    sJ d S )Nz$days since 2000-01-01T00:00:00-05:00r  )r,   r,   r,   )rR   r   r   r   dthourr   r   rD  r  r   assert_allclose)	r4   r  expected_num_datesr  result_hoursexpected_hoursresult_num_datesresult_unitsresult_calendars	            r5   'test_time_units_with_timezone_roundtripr  h  s     <N))),,1>8LLE U##&+Lyyy))N~... 7I~x7 73lO &&&

%%&68JKKKK 	
""#35GHHH>))))h&&&&&&r7   c                    ddg}d}t          j        dd          }t                      5  t          |||           }t          j                            ||           d d d            d S # 1 swxY w Y   d S )Nr   rM   r(   r  r+   r   r^   r   r   r   rR   r  r   r4   numerical_datesrD   rg   ry   s        r5   2test_use_cftime_default_standard_calendar_in_ranger    s    !fO#E}VQ///H			 8 8#OUHEE

%%fh7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   2A**A.1A.
units_year  	  c                
   ddl m} ddg}d| d} |||| d          }t          j        t                    5  t          |||           }t          j                            ||           d d d            d S # 1 swxY w Y   d S Nr   rQ   rM   r   r   TrH   )	r;   rQ   rE  rf  r   r   rR   r  r   r4   r  rQ   r  rD   rg   ry   s          r5   6test_use_cftime_default_standard_calendar_out_of_ranger    s      !fO,*,,,ExD  H 
*	+	+ 8 8#OUHEE

%%fh7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   2A88A<?A<)r  i  r  c                    ddl m} ddg}d| d} |||| d          }t                      5  t          |||           }t          j                            ||           d d d            d S # 1 swxY w Y   d S r  r;   rQ   r   r   rR   r  r   r  s          r5   -test_use_cftime_default_non_standard_calendarr    s      !fO,*,,,ExD  H 
		 8 8#OUHEE

%%fh7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   2A--A14A1c                    ddl m} ddg}d| d} |||| d          }t                      5  t          ||| d          }t          j                            ||           d d d            d S # 1 swxY w Y   d S )	Nr   r  rM   r   r   TrH   
use_cftimer  r  s          r5   test_use_cftime_truer    s      !fO,*,,,ExD  H 
		 8 8#OUHQUVVV

%%fh7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   4A//A36A3c                    ddg}d}t          j        dd          }t                      5  t          ||| d          }t          j                            ||           d d d            d S # 1 swxY w Y   d S )	Nr   rM   r(   r  r+   r   Fr  r  r  s        r5   0test_use_cftime_false_standard_calendar_in_ranger    s    !fO#E}VQ///H			 8 8#OUHQVWWW

%%fh7778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   4A,,A03A0c                    ddg}d| d}t          j        t                    5  t          ||| d           d d d            d S # 1 swxY w Y   d S Nr   rM   r   r   Fr  rE  rF  r   r   r4   r  r  rD   s       r5   4test_use_cftime_false_standard_calendar_out_of_ranger         !fO,*,,,E	*	+	+ O O?E8NNNNO O O O O O O O O O O O O O O O O O   AA	A	c                    ddg}d| d}t          j        t                    5  t          ||| d           d d d            d S # 1 swxY w Y   d S r  r  r  s       r5   +test_use_cftime_false_non_standard_calendarr    r  r  c                   ddl m} | t          j        j        v }g d}d} |||| d          }|rjt          j        t                    5 }t          |||           }d d d            n# 1 swxY w Y   d |j	        D             }t          |          d	k    sJ n8t                      5  t          |||           }d d d            n# 1 swxY w Y   t          j                            ||           d S )
Nr   r  r  zdays since 1-1-1Tr   r   c                `    g | ]+}t          |j                                      d           )|,S )z&Ambiguous reference date string: 1-1-1)strmessage
startswith)r2   rs     r5   r6   z4test_decode_ambiguous_time_warns.<locals>.<listcomp>  sE     
 
 
19~~(()QRR

 
 
r7   rM   )r;   rQ   r   r[   rD  rE  rf  r   r   listr   r   rR   r  r   )	r4   rQ   is_standard_calendarr  rD   rg   r   ry   relevant_warningss	            r5    test_decode_ambiguous_time_warnsr    s      $v|'GGIIEExuxSWXXXH I\.// 	I6'uxHHHF	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I
 
[
 
 

 $%%*****!! 	I 	I'uxHHHF	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I J!!&(33333s$   
A))A-0A-)CCCencoding_unitsr   r   c                   t           s|t          k    rt          j        d           |dk    s| dk    r|t          k    rt          j        d            |dd|          }|  d}t          j                            ||          \  }}}t          j                            |           }t          j	        d	|          }t          j        d	|          |k    r|j        t          j        k    sJ d S |j        t          j        k    sJ d S )
NzTest requires cftimer   r   z3Nanosecond frequency is not valid for cftime dates.r  r   r  z since 2000-01-01rM   )r   r
   rE  skipr   r[   r   _netcdf_to_numpy_timeunitrR   rb   r^   r_   r   r  r)   )	r  r   r   r[   rD   rl   rm   numpy_timeunitencoding_units_as_timedeltas	            r5   1test_encode_cf_datetime_defaults_to_correct_dtyper    s     ,*44*+++~66J,<V<VIJJJJvqt444E000EL33E5AAMGQ\;;NKKN"$.N"C"C	q$#>>>}((((((}
******r7   c                   t          j        dd          }|                    t          j        dd|                     }t          dg|          }t	          j        |          }t	          j        d|          }t          ||           d S )Nz
1678-01-01rM   r   1968r+   r  r   )r^   r   appendr	   r   encode_cf_variabledecode_cf_variabler   r   initial_timer[   r   rl   decodeds         r5   'test_encode_decode_roundtrip_datetime64r    s     =q999Lfad K K KLLE%((H,X66G,VW==G7#####r7   )r   r   r   r   r   r   c                ,   t          dd          }|                    t          dd|           t          d          z             }t          dg|          }t	          j        |          }t	          j        d|d	
          }t          ||           d S )N0001rM   r   r+   r  iXT)rv   r   Tr  )r
   r  r   r	   r   r  r  r   r  s         r5   #test_encode_decode_roundtrip_cftimer  !  s      222LVQT222YL5Q5Q5QQ E %((H,X66G,VWNNNG7#####r7   c                 .   dd l } d}|                     ddgd|          }d}	 |                     |||d          }n'# t          $ r |                     |||          }Y nw xY wt	          |||          }t
          j                            ||           d S )Nr   r9   rM   rn  r(   F)
longdouble)r;   rQ   r   	TypeErrorr   rR   r  r   )r;   r4   r[   r  rg   ry   s         r5   !test__encode_datetime_with_cftimer  .  s     MMMHOOQF$<hGGE,N
D??5.(u?UU D D D??5.(CCD)%JJFJFH-----s   = !A! A!)r9   	Gregorian	GREGORIANc                    ddg}d}| |d}t          dg||          }t          j        d|          }t          j        |          }t	          j        |j        t          j                  sJ t          ||           d S )Nr   rM   r(   r[  r   )	r	   r   r  r  rR   
issubdtyper   
datetime64r   )r4   r[   rD   rC  r   r  rl   s          r5   7test_decode_encode_roundtrip_with_non_lowercase_lettersr  D  s     FE#E!E22E%//H,VX>>G,W55G =66666
 Xw'''''r7   c                     t          dddd          } t          j        t          d          5  t	          | dd	           d d d            d S # 1 swxY w Y   d S )
Nz
1000-01-01r|   rY  r"   r   r   r4   z3Source time range is not valid for numpy datetimes.r  rO  Fr
   rE  rF  rG  r   srcs    r5   /test_should_cftime_be_used_source_outside_ranger  X  s    
|Sth
O
O
OC	O
 
 
 7 7 	sJ6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7   AAAc                     t          dddd          } t          j        t          d          5  t	          | dd           d d d            d S # 1 swxY w Y   d S )	Nr   r|   rY  r"   r  z,Calendar 'noleap' is only valid with cftime.r  Fr  r  s    r5   ,test_should_cftime_be_used_target_not_npabler  a  s    
|Sth
O
O
OC	H
 
 
 5 5 	sHe4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5r  r   c                    d} | d          }t          ||          }t          j        t          j        dd                    }t          j                            ||           d S )Nz"seconds since 2018-08-22T03:23:03Z2   z2018-08-22T03:23:53r'  )r   rR   r\   r  r  r   )r   rD   rC   ry   rg   s        r5   test_decode_cf_datetime_uintr  j  s]    0Eb		I	511Fz"-(=tDDEEHJFH-----r7   c                     d} t          j        d          }t          ||           }t          j        t          j        dd                    }t           j                            ||           d S )Nzdays since 1700-01-01i] z
2200-01-01r'  )rR   uint64r   r\   r  r  r   )rD   rC   ry   rg   s       r5   *test_decode_cf_datetime_uint64_with_cftimer  s  s^    #E	&!!I	511Fz"-d;;<<HJFH-----r7   c                     d} d}t          j        d          }t          j        t                    5  t          || |           d d d            d S # 1 swxY w Y   d S )Nzmicroseconds since 1700-01-01r#   l     5h6> )rR   r  rE  rF  OverflowErrorr   )rD   r4   rC   s      r5   9test_decode_cf_datetime_uint64_with_cftime_overflow_errorr  |  s    +EH	<==I	}	%	% 7 79eX6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   AAAr  TFc                "   | rt           st          j                     | rt          nd}t	          j        g |          }t          t	          j        dt          j                  dd|           }t          j	        
                    ||           d S )Nr   r   r   )r  r   r  r:   )rD   r4   r  )r   rE  r  objectrR   r   r   zerosr  r  r   )r  r   rg   rj   s       r5   test_decode_0size_datetimer    s      *  .FFhEx%(((H
q))).&	  F JHf-----r7   c                    t          dt          j        ddgddgg          dt          j        i          } t          j                                                            |           }t          j        |j	        d                   sJ d S )Nr   r   rM   r+   r   rD   )
r	   rR   r   r*  r   r[   r   r   isnanrC  )r   ry   s     r5   test_scalar_unitr    sw     
BHq!fq!f-=$>$>"&@QRRH\))++228<<F8FL)*******r7   c            	         dd l } ddlm} t          j        |                     dddd          |                     dddd          gt                    }t          |          } ||          sJ d S )Nr   )_contains_cftime_datetimesrM   r+   r   )r;   xarray.core.commonr  rR   r   r@   r	  r   )r;   r  r[   r   s       r5   test_contains_cftime_lazyr    s    MMM======H		!	!!Q1	-	-v/G/G1aQR/S/ST  E (..E%%e,,,,,,,r7   )rE   rF   )
__future__r   rX   ru   r   	itertoolsr   numpyrR   pandasr^   rE  pandas.errorsr   xarrayr   r   r	   r
   r   r   r   xarray.coding.timesr   r   r   r   r   r   xarray.coding.variablesr   xarray.conventionsr   r   r  r   xarray.testingr   r   xarray.testsr   r   r   r   r   r   r    _NON_STANDARD_CALENDARS_SETsortedunionr[   rD  _ALL_CALENDARS_NON_STANDARD_CALENDARSr   astyper   r   int32_CF_DATETIME_NUM_DATES_UNITS_CF_DATETIME_TESTSrB   markrZ   parametrizern   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*  r   r   FREQUENCIES_TO_ENCODING_UNITSitemsr  r   r
  _CFTIME_DATETIME_UNITS_TESTSr  r  r+  r.  r_   r6  r:  rK  rW  rh  fixturer4   r\  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   keysr   r  r  r  r  r  r  r  uint8uint16uint32r  r  r  r  r  r  r  r1   r7   r5   <module>r1     so   " " " " " "                       - - - - - -                                 9 8 8 8 8 8 D D D D D D D D 8 8 8 8 8 8 9 9 9 9 9 9 9 9                     %%fl&FGG  !&!<== fV\=>> RYr]]+,RYr]])$$&=>RYr]])$$&=>RYr]]1a  "9:
YRYq\\<= YRYq\\<=
YRYq\\<=
YRYq\\?@!T#$	dV$%"X&'RXb\\*+ S
!"cU#$RYq\\*+RYq&%  "9:RYq&%  "67/	3Z2311RXi45
YRYq\\BC.0;<=  @ %,W$&9& &      DEE;;;=OPP =  =  = QP FE  =F % % % %() ) ) ) : : : :$ %8996 6 6 :9 6$ %<==6 6 6 >= 6. ^446 6 6 54 62 %8992 2 2 :9 2 %<==- - - >= - %<=== = = >= =$ %8997 7 7 :9 7: %<==$7 $7 $7 >= $7N ^447 7 7 54 7@ JJJ   	  
 - - - -0 ) ) ) ) +++
&*UG4
&!-7M/NOVQN#CCC	
 ) ) )   ) 5 5 5 5 
						! !  *,I,O,O,Q,QRR@ @ @ SR@ j BN>>>??,	
 
-	.	.0PQ		 	 "BC
 
@ @ @
 
@
 L!#JK;;;2
 	433/
   ';8M*NN  24PQQ@ @ @ RQ  
@ &&&	vxrx{{#			VXRXiii%A%AB	w$	,	,	xrx{{+			dRVQN3
3*-	
"&"&!12 ) ) ) ).	* 	* 	* 	* z	'8,	-	-v6	$/	0	0':	$bf-	.	.	:	&&)	*	*I6	 B B B B *   " " "  " ^447 7 7 547,&, &, &, &,R "+ "+ "+ "+J ~&&&  '&          9 9 9 9 A A A  A 8 8 8 8 @ @ @  @ *YYr]]IIq!f<M<M,NOOC C C POC *YYr]]IIq!f<M<M,NOOK K K PO K "<"<"<==4 4 4 >= 4> > > >	) 	) 	) 	) ) ) ) )  ' ' ' '6 %8998 8 8 :98 %899d|448 8 8 54 :9 8  %<=='9'9'9::8 8 8 ;: >= 8 ^44'9'9'9::8 8 8 ;: 54 8 %8998 8 8 :98 %899d|44O O O 54 :9O %<=='9'9'9::O O O ;: >=O ^444 4 4 54 48 )+H+O+O+Q+QRR!>!C!C!E!EFF|'DEE+ + + FE GF SR+& !>!C!C!E!EFF$ $ $ GF$ !?!?!?@@$ $ $ A@ $ . . . .* %L%L%LMM( ( ( NM(& 7 7 7 5 5 5 28RY	29"MNN. . ON. . . . 7 7 7 e}55. . 65.  + + + + 
- 
- 
- 
- 
- 
-r7   