U
    NZfXP                     @   s   d dl m Z  d dlmZ d dlmZmZ d dlZd dl	Z	d dl
Z
d dl
m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 d d	lmZ d dlm  mZ d dlmZ  G d
d dZ!e	j"#dd dgdd Z$dS )    )datetime)gettz)given
strategiesN)utc)lib)NaTOutOfBoundsDatetime	Timedelta	Timestamp
conversioniNaT	to_offset)NpyDatetimeUnit)INVALID_FREQ_ERR_MSGc                   @   sD  e Zd Zdd Zejddddddd	d
gdd Zdd Zdd Z	dd Z
dd Zdd Zejdddddddddgd d! Zejd"d#d$d%d&d'd(gejd)d*d+d,gd-d. Zejd/d0d1d2d3gd4d5 Zejd/d0d1d2d3gd6d7 Zejd8d*d,d+gejd/d0d1d2d3gd9d: Zejd;d*d<d=gd,d<d=gd+d>d?ggejd/d0d1d2d3gd@dA ZejdBdCdDdEdFdGdHgejdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[gd\d] Zd^d_ Zejjd`dadbeeedc ejddejd8ejejejgdedf Z dgdh Z!didj Z"dkdl Z#dmdn Z$dodp Z%dqdr Z&dsdt Z'dudv Z(dwdx Z)e*j+dydz Z,ejd{e-.d|d}d~ fe/d|dd~ fgdd Z0ejd/d0d1d2d3gdd Z1ejdddcgejdddgejd/d0d1d2d3gdd Z2ejdddgejd/d0d1d2d3gdd Z3dd Z4e*j+dd Z5dS )TestTimestampUnaryOpsc              	   C   s4   t d}d}tjt|d |d W 5 Q R X d S )N
2016-01-01zDivision by zero in roundingmatchZ0ns)r   pytestraises
ValueErrorround)selftsmsg r   P/tmp/pip-unpacked-wheel-nbcvw55c/pandas/tests/scalar/timestamp/test_unary_ops.py!test_round_divison_by_zero_raises    s    z7TestTimestampUnaryOps.test_round_divison_by_zero_raisesztimestamp, freq, expected)20130101 09:10:11D20130101)z20130101 19:10:11r    20130102)z20130201 12:00:00r    Z20130202)z20130104 12:00:00r    Z20130105)2000-01-05 05:09:15.13r    z2000-01-05 00:00:00)r#   Hz2000-01-05 05:00:00)r#   Sz2000-01-05 05:09:15c                 C   s*   t |}||}t |}||ks&td S Nr   r   AssertionError)r   	timestampfreqexpecteddtresultr   r   r   test_round_frequencies(   s    
z,TestTimestampUnaryOps.test_round_frequenciesc                 C   sT   t ddd}|d}t ddd}||ks.tt ddd}|d}||ksPtd S )Nr   
US/Easterntzr    r!   sr'   r   r,   r-   r+   r   r   r   test_round_tzaware:   s    

z(TestTimestampUnaryOps.test_round_tzawarec                 C   s*   t d}|d}t d}||ks&td S )Nz20130104 12:32:00Z30Minz20130104 12:30:00r'   r3   r   r   r   test_round_30minD   s    
z&TestTimestampUnaryOps.test_round_30minc                 C   s   t dd}t d}||ks"tt dd}t d}||ksDtt d}dD ]}|||ksPtqPt dd}t d	}||kstd S )
Nz2016-10-17 12:00:00.0015msz2016-10-17 12:00:00.002000z2016-10-17 12:00:00.00149z2016-10-17 12:00:00.001000)usns2016-10-17 12:00:00.00150103110nsz2016-10-17 12:00:00.001501030r'   )r   r-   r+   r   r*   r   r   r   test_round_subsecondK   s    z*TestTimestampUnaryOps.test_round_subsecondc              	   C   s(   t d tdd W 5 Q R X d S )NFr9   Z1010ns)tmZassert_produces_warningr   r   )r   r   r   r   test_round_nonstandard_freq]   s    z1TestTimestampUnaryOps.test_round_nonstandard_freqc              	   C   s0   t d}tjttd |d W 5 Q R X d S )Nr#   r   foo)r   r   r   r   r   r   )r   Zstampr   r   r   test_round_invalid_arga   s    z,TestTimestampUnaryOps.test_round_invalid_argz#test_input, rounder, freq, expected)2117-01-01 00:00:45floor15sr@   )r@   ceilrB   r@   )z2117-01-01 00:00:45.000000012rA   r:   z2117-01-01 00:00:45.000000010)z1823-01-01 00:00:01.000000012rC   r:   z1823-01-01 00:00:01.000000020)1823-01-01 00:00:01rA   1srD   )rD   rC   rE   rD   )r   rA   rE   r   )r   rC   rE   r   c                 C   sH   t |}t||}||}|tkr0|tksDtnt |}||ksDtd S r&   )r   getattrr   r(   )r   
test_inputrounderr*   r+   r,   funcr-   r   r   r   test_ceil_floor_edgef   s    
z*TestTimestampUnaryOps.test_ceil_floor_edgeztest_input, freq, expected)2018-01-01 00:02:062srK   )2018-01-01 00:02:00Z2TrM   )2018-01-01 00:04:00Z4TrN   )2018-01-01 00:15:00Z15TrO   )2018-01-01 00:20:00Z20TrP   )2018-01-01 03:00:00Z3HrQ   rH   rC   rA   r   c                 C   s2   t |}t |}t||}||}||ks.td S r&   )r   rF   r(   )r   rG   r*   r+   rH   r,   rI   r-   r   r   r   test_round_minute_freq   s
    
z,TestTimestampUnaryOps.test_round_minute_frequnitr8   r7   r6   r2   c                 C   s@   t d|}|d}t d}||ks,t|j|jks<td S )Nr   r    r"   )r   as_unitrC   r(   _cresor   rS   r,   r-   r+   r   r   r   	test_ceil   s
    
zTestTimestampUnaryOps.test_ceilc                 C   s@   t d|}|d}t d}||ks,t|j|jks<td S )Nr   r    r!   )r   rT   rA   r(   rU   rV   r   r   r   
test_floor   s
    
z TestTimestampUnaryOps.test_floormethodc              	   C   s   t dddd}||}t||ddd}||ks:t|jttd| jksVtt||dd	d}t d
ddd}||kst|jttd| jkstt||ddd}|tkstd}t	j
tj|d t||ddd W 5 Q R X d S )Nz2017-10-29 00:00:00UTCr0   zEurope/Madridr$   TZ	ambiguousNPY_FR_Fz2017-10-29 01:00:00r   zCannot infer dst timer   raise)r   
tz_convertrT   rF   r(   rU   r   valuer   r   r   pytzZAmbiguousTimeError)r   rY   rS   r   r-   r+   r   r   r   r   test_round_dst_border_ambiguous   s     
z5TestTimestampUnaryOps.test_round_dst_border_ambiguouszmethod, ts_str, freqz2018-03-11 01:59:00-0600Z5minz2018-03-11 03:01:00-0500Z2Hc           	   	   C   s   t |dd|}t|||dd}t ddd}||ks<t|jttd| jksXtt|||dd}|tksvtd}tj	t
j|d	 t|||d
d W 5 Q R X d S )NAmerica/Chicagor0   Zshift_forward)Znonexistentz2018-03-11 03:00:00r\   r   z2018-03-11 02:00:00r   r]   )r   rT   rF   r(   rU   r   r_   r   r   r   r`   ZNonExistentTimeError)	r   rY   Zts_strr*   rS   r   r-   r+   r   r   r   r   !test_round_dst_border_nonexistent   s    z7TestTimestampUnaryOps.test_round_dst_border_nonexistentr)   z2018-01-01 0:0:0.124999360z2018-01-01 0:0:0.125000367z2018-01-01 0:0:0.125500z2018-01-01 0:0:0.126500z2018-01-01 12:00:00z2019-01-01 12:00:00r*   Z2nsZ3nsZ4nsZ5nsZ6nsZ7nsZ250nsZ500nsZ750nsZ1usZ19usZ250usZ500usZ750usrE   rL   Z3sZ1Dc                 C   sD  t |d}t|j}||}|j| dks@td| dd|j|j   kr\|k sfn td||}|j| dkstd| dd|j|j   kr|k sn td||}|j| dkstd| dt	|j|j |d	 kstd
|d	 dkr@t	|j|j |d	 kr@|j| d	 dks@tdd S )Nr8   r   zfloor not a z	 multiplezfloor errorzceil not a z
ceil errorzround not a    zround errorzround half to even error)
r   rT   r   nanosrA   _valuer(   rC   r   abs)r   r)   r*   r,   rS   r-   r   r   r   test_round_int64   s    %

&
&
 (z&TestTimestampUnaryOps.test_round_int64c              	   C   s   t jd}t dddddd}||ks*tt jd}t jtd }||ksPttjt	d	d
 t jd W 5 Q R X d
ddg}tjt	|d
 t jd W 5 Q R X d S )Nr2   i  	      r      ,   i2zvalue too larger   |z)Python int too large to convert to C longzint too big to convert)r   minrC   r(   maxrA   r
   r   r   OverflowErrorjoin)r   r-   r+   r   r   r   r    test_round_implementation_bounds  s    z6TestTimestampUnaryOps.test_round_implementation_boundszFailing on buildsF)reasonstrict   )valc                    s  t |}t|} fdd} |d|ks0t |d}d}t || j|k sVt|j| dksht||||  |d}d}t || j|k st|j| dkst||||  |d	}d
}t || j|k st|j| dkst||||  |d}d}t || j|k s$t|j| dks8t||||  |d}d}t || j|k slt|j| dkst||||  |d}d}t || j|k st|j| dkst|||| d S )Nc                    s^    t jkr,t| | j}||d ksZtn. t jkrD| |ksZtn t jkrZ| |ksZtd S )Nrd   )r   r   nprg   rf   r(   rA   rC   )resr   re   ZdiffrY   r   r   checker<  s    


z8TestTimestampUnaryOps.test_round_sanity.<locals>.checkerr8   r7   i  r   r6   i@B r2   i ʚ;rn   l    Xp7 hl     qar    l     "R: )rw   Zint64r   r(   rg   rf   )r   rv   rY   r   rz   rx   re   r   ry   r   test_round_sanity3  sD    
	





z'TestTimestampUnaryOps.test_round_sanityc              	   C   s|   t dd}d}tjt|d |jdd W 5 Q R X |d}|jdd}|jdks\t|jt t	
ddjksxtd S )	Nr   r8   z8Out of bounds nanosecond timestamp: 99999-01-01 00:00:00r   i yearr6   z99999-01-01)r   rT   r   r   r	   replacer~   r(   rf   rw   Z
datetime64)r   r   r   r-   r   r   r   %test_replace_out_of_pydatetime_boundsn  s    
z;TestTimestampUnaryOps.test_replace_out_of_pydatetime_boundsc                 C   sb   t dtjjd }| tdddks*t|jdd}|j	|j	ksFt| tdddks^td S )Nl      T1)
i  rk      i$  r}   )
r   Z_from_value_and_resor   Z	NPY_FR_usr_   to_pydatetimer   r(   r   rU   )r   r   r-   r   r   r   test_replace_non_nano{  s      z+TestTimestampUnaryOps.test_replace_non_nanoc                 C   s,   t d}|jdd}t d}||ks(td S )N2016-01-01 09:00:00r   hour2016-01-01 00:00:00r   r   r(   )r   r   r-   r+   r   r   r   test_replace_naive  s    z(TestTimestampUnaryOps.test_replace_naivec                 C   s8   |}t d|d}|jdd}t d|d}||ks4td S )Nr   r0   r   r   r   r   r   tz_aware_fixturer1   r   r-   r+   r   r   r   test_replace_aware  s
    z(TestTimestampUnaryOps.test_replace_awarec                 C   s8   |}t d|d}|jdd}t d|d}||ks4td S )N2016-01-01 09:00:00.000000123r0   r   r   z2016-01-01 00:00:00.000000123r   r   r   r   r   test_replace_preserves_nanos  s
    z2TestTimestampUnaryOps.test_replace_preserves_nanosc              
   C   sF   |}t d|d}|jddddddddd}t d|d}||ksBtd S )	Nr   r0   i  rd   r      )r~   monthdayr   minutesecondmicrosecondZ
nanosecondz2015-02-02 00:05:05.000005005r   r   r   r   r   test_replace_multiple  s    
z+TestTimestampUnaryOps.test_replace_multiplec              	   C   s>   |}t d|d}d}tjt|d |jdd W 5 Q R X d S )Nr   r0   z.replace\(\) got an unexpected keyword argumentr   r   )r>   )r   r   r   	TypeErrorr   r   r   r1   r   r   r   r   r   test_replace_invalid_kwarg  s
    z0TestTimestampUnaryOps.test_replace_invalid_kwargc              	   C   s>   |}t d|d}d}tjt|d |jdd W 5 Q R X d S )Nr   r0   z;value must be an integer, received <class 'float'> for hourr   g?r   )r   r   r   r   r   r   r   r   r   test_replace_integer_args  s
    z/TestTimestampUnaryOps.test_replace_integer_argsc                 C   s*   t ddd}|d |jd dks&td S )Nz2013-11-03 01:59:59.999999-0400r/   r0   tzinfo)r   tz_localizer   r(   )r   r   r   r   r   *test_replace_tzinfo_equiv_tz_localize_none  s    z@TestTimestampUnaryOps.test_replace_tzinfo_equiv_tz_localize_nonec              	   C   s   t dddd}tdj|ddj}|j|d}t|j|d}td	 |	 |	 ks`t
W 5 Q R X ||ksvt
|| kst
|j|djd d}t|j|djd d}td	 |	 |	 kst
W 5 Q R X ||kst
|| kst
d S )
Ni        ru   ZCETF)Zis_dstr   rZ   )r   r`   timezoneZlocalizer   r   r   r<   set_timezoner)   r(   r   )r   r,   r   Z	result_dtZ	result_pdr   r   r   test_replace_tzinfo  s    z)TestTimestampUnaryOps.test_replace_tzinfoztz, normalizer/   c                 C   s   | j | S r&   )r   	normalizexr   r   r   <lambda>      zTestTimestampUnaryOps.<lambda>c                 C   s   | S r&   r   r   r   r   r   r     r   c                 C   sd   t d}t||}|||ks$t|jdd}|j|jf|j|jfksLt||}||ks`td S )Nz2017-12-03 16:03:30   )r   )r   r   Zlocalize_pydatetimer(   r   r   r   )r   r1   r   Zts_naiveZts_awareZts2Zts2br   r   r   test_replace_across_dst  s    
z-TestTimestampUnaryOps.test_replace_across_dstc                 C   sV   t ddd|}|jdd}t ddd}||ks6t|jttd| jksRtd S )Nz	2013-11-3rb   r0   r   r   z2013-11-3 03:00:00r\   )r   rT   r   r(   rU   rF   r   r_   )r   rS   tr-   r+   r   r   r   test_replace_dst_border  s
    z-TestTimestampUnaryOps.test_replace_dst_borderfoldr   r1   zdateutil/Europe/LondonzEurope/Londonc                 C   s|   t ddddd}t||d|}|jd|d}tt dddddj|| d	}||ks\t|jttd
| j	ksxtd S )Ni  
   r   rd      r0   ru   )r   r   r[   r\   )
r   r   rT   r   r   r(   rU   rF   r   r_   )r   r   r1   rS   dr   r-   r+   r   r   r   test_replace_dst_fold  s     z+TestTimestampUnaryOps.test_replace_dst_foldarg
2013-11-30z2013-11-30 12:00:00c                 C   sV   |}t ||d|}| }t d|d}||ks6t|jttd| jksRtd S )Nr0   r   r\   )r   rT   r   r(   rU   rF   r   r_   )r   Ztz_naive_fixturer   rS   r1   r   r-   r+   r   r   r   test_normalize  s    z$TestTimestampUnaryOps.test_normalizec                 C   s$   t d }t d}||ks td S )Nz1969-01-01 09:00:00z1969-01-01 00:00:00)r   r   r(   )r   r-   r+   r   r   r   test_normalize_pre_epoch_dates  s    z4TestTimestampUnaryOps.test_normalize_pre_epoch_datesc              	   C   s   |}|j td}| | ks$ttddd}|d}| | ksNttd" | }| | ksvtW 5 Q R X d S )Nr   z2014-10-11 11:00:01.12345678z
US/Centralr0   rZ   )	r   r   r)   r(   r   r^   r<   r   r   )r   Zfixed_now_tsr   ZutsZtscZutscr,   r   r   r   test_timestamp&  s    
z$TestTimestampUnaryOps.test_timestampN)6__name__
__module____qualname__r   r   markparametrizer.   r4   r5   r;   r=   r?   rJ   rR   rW   rX   ra   rc   rh   rr   Zxfailr   stZintegersr   r   Zi8maxr   r   rA   rC   r|   r   r   r   r   r   r   r   r   r   tdZskip_if_windowsr   r`   r   r   r   r   r   r   r   r   r   r   r   r   r      s  







 6
	


r   r   ru   c              	   C   s<   t d}tddddd| |d}|jdd	}|j| ks8td S )
NzEurope/Moscowi  r      rd   r   )r~   r   r   r   r   r   r   ru   )r   )r   r   r   r   r(   )r   r1   r   Zts_replacedr   r   r   test_replace_preserves_fold;  s    r   )%r   Zdateutil.tzr   Z
hypothesisr   r   r   Znumpyrw   r   r`   r   Zpandas._libsr   Zpandas._libs.tslibsr   r	   r
   r   r   r   r   Zpandas._libs.tslibs.dtypesr   Zpandas._libs.tslibs.periodr   Zpandas.util._test_decoratorsutilZ_test_decoratorsr   Zpandas._testingZ_testingr<   r   r   r   r   r   r   r   r   <module>   s&   $	    !