U
    c3                     @  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	m
Z
mZ d dlmZmZ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ZmZmZ d d
lmZm Z m!Z! d dl"m#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/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z9 d dl:m;Z; d dl<m=  m>Z? d dl@mAZA er\d dlBmCZC ddddddZDG dd de9jEZFd+dddd d!ZGd,d#d$ZHd-d%d&ZId'd(d)d*ZJdS ).    )annotations)	timedelta)TYPE_CHECKINGcastN)libtslibs)	
BaseOffsetNaTNaTTypeTick	Timedeltaastype_overflowsafeiNaTperiods_per_second	to_offset)precision_from_unit)get_timedelta_field)array_to_timedelta64ints_to_pytimedeltaparse_timedelta_unit)DtypeObjNpDtypenpt)function)validate_endpoints)astype_td64_unit_conversion)	TD64NS_DTYPEis_dtype_equalis_float_dtypeis_integer_dtypeis_object_dtype	is_scalaris_string_dtypeis_timedelta64_dtypepandas_dtype)isna)nanops)datetimelike)generate_regular_range)unpack_zerodim_and_defer	DataFramestr)namealias	docstringc                   s.   dd fdd}| |_ d| d|_t|S )N
np.ndarrayreturnc                   s0   | j }t| | jd}| jr,| j|d dd}|S )NZresofloat64)
fill_valueconvert)asi8r   _reso_hasna_maybe_mask_results)selfvaluesresultr.    A/tmp/pip-unpacked-wheel-g7fro6k3/pandas/core/arrays/timedeltas.pyfB   s      z_field_accessor.<locals>.f
)__name____doc__property)r-   r.   r/   rA   r?   r>   r@   _field_accessorA   s    
rF   c                      s<  e Zd ZU dZdZeddZeeje	fZ
eZdZedddd	Zd
Zg Zded< g Zded< dgZded< ddddgZded< ee e Zded< dddddgZded< ddddd Zed!dd"d#Zd$ZeZed%d& Zed$efd'd(d d) fd*d+Zeed,d-d.d d/d0d1Z eed,e!j"d$fd.d d/d2d3Z#edd4d5Z$dd.dd6d7d8Z%ddd9d:Z&dd.d;d6d<d=Z'dd.d?d@dAZ(dBdC Z)d$d$d$d,d$d>dDdEdFdGd.d.dHdIdJdKZ*d$d$d$dLd,d>dMdFdGdHd.d.dNdOdPZ+dd.dQdRdSZ,dd$dTdUddVdWZ-dXdY Z.e/dZd dd[d\Z0e0Z1e/d]d^d_ Z2e/d`dadb Z3e/dcddde Z4e/dfdgdh Z5e/didjdk Z6e/dldmdn Z7e/dodpdq Z8e/drdsdt Z9d ddudvZ:d ddwdxZ;d ddydzZ<d{dd|d}Z=dUdd~dZ>e?dddZ@e?dddZAe?dddZBe?dddZCeddddZD  ZES )TimedeltaArraya  
    Pandas ExtensionArray for timedelta data.

    .. warning::

       TimedeltaArray is currently experimental, and its API may change
       without warning. In particular, :attr:`TimedeltaArray.dtype` is
       expected to change to be an instance of an ``ExtensionDtype``
       subclass.

    Parameters
    ----------
    values : array-like
        The timedelta data.

    dtype : numpy.dtype
        Currently, only ``numpy.dtype("timedelta64[ns]")`` is accepted.
    freq : Offset, optional
    copy : bool, default False
        Whether to copy the underlying array of data.

    Attributes
    ----------
    None

    Methods
    -------
    None
    Ztimedeltaarrayr	   ns)r   timedelta64ztype[Timedelta]r1   c                 C  s   t S Nr   r;   r?   r?   r@   _scalar_typev   s    zTimedeltaArray._scalar_typei  z	list[str]
_other_ops	_bool_opsfreq_object_opsdayssecondsmicrosecondsnanoseconds
_field_ops_datetimelike_opsto_pytimedeltatotal_secondsroundfloorceil_datetimelike_methodsznp.timedelta64Timedelta | NaTType)xr2   c                 C  s(   | d}|tjkrtS tj|| jdS )Ni8r3   )viewr	   valuer   Z_from_value_and_resor8   )r;   r_   yr?   r?   r@   	_box_func   s    

zTimedeltaArray._box_funcznp.dtypec                 C  s   | j jS )a3  
        The dtype for the TimedeltaArray.

        .. warning::

           A future version of pandas will change dtype to be an instance
           of a :class:`pandas.api.extensions.ExtensionDtype` subclass,
           not a ``numpy.dtype``.

        Returns
        -------
        numpy.dtype
        )_ndarraydtyperL   r?   r?   r@   rf      s    zTimedeltaArray.dtypeNc                 C  s   t |j t |}|S rJ   )_validate_td64_dtyperf   )clsr<   rf   r?   r?   r@   _validate_dtype   s    
zTimedeltaArray._validate_dtyper0   zBaseOffset | None)r<   rP   r2   c                   sh   t |tjr|jdkstt|r(tt |tjs@tt|||jksNtt	 j
||d}||_|S )Nm)r<   rf   )
isinstancenprf   kindAssertionErrorr   Zis_unitlessZndarraytypesuper_simple_new_freq)rh   r<   rP   rf   r=   	__class__r?   r@   rq      s    zTimedeltaArray._simple_newFrf   copyboolrv   r2   c                C  sB   |rt | t||d d\}}td |d\}}| j||j|dS )Nrv   unitFrf   rP   )rg   sequence_to_td64nsdtlvalidate_inferred_freqrq   rf   )rh   datarf   rv   inferred_freqrP   _r?   r?   r@   _from_sequence   s
    zTimedeltaArray._from_sequencec           
      C  s   |rt | |dkst|d k}|tjk	r.|nd }t|\}}t|||d\}}t|||\}}|rld }| j||j	|d}	|d kr|d k	r| 
|	| n|rt|	j|	_|	S )NYrc   Mry   r{   )rg   rn   r   
no_defaultr}   Zmaybe_infer_freqr|   r~   rq   rf   Z_validate_frequencyr   r   rr   )
rh   r   rf   rv   rP   rz   Zexplicit_noneZ
freq_inferr   r=   r?   r?   r@   _from_sequence_not_strict   s     	z(TimedeltaArray._from_sequence_not_strictc           
      C  s   t |}|d kr2tdd |||fD r2tdt||||dkrNtd|d k	r^t|}|d k	rnt|}t|\}}|d k	rt||||}nt	
|j|j|d}|s|dd  }|s|d d }|d	}	| j|	|	j|d
S )Nc                 s  s   | ]}|d kV  qd S rJ   r?   .0r_   r?   r?   r@   	<genexpr>   s     z1TimedeltaArray._generate_range.<locals>.<genexpr>z1Must provide freq argument if no data is supplied   zVOf the four parameters: start, end, periods, and freq, exactly three must be specifiedr`      m8[ns]r{   )r}   Zvalidate_periodsany
ValueErrorcomZcount_not_noner   r   r(   rl   Zlinspacerb   astypera   rq   rf   )
rh   startendZperiodsrP   closedZleft_closedZright_closedindexZ
td64valuesr?   r?   r@   _generate_range   s*    
 
zTimedeltaArray._generate_range)setitemr2   c                 C  s8   t || js|tk	rtd| j||d t|jdS )Nz'value' should be a Timedelta.)r   rH   )rk   rM   r	   r   _check_compatible_withrl   rI   rb   )r;   rb   r   r?   r?   r@   _unbox_scalar  s    zTimedeltaArray._unbox_scalarc                 C  s   t |S rJ   rK   )r;   rb   r?   r?   r@   _scalar_from_string  s    z"TimedeltaArray._scalar_from_stringNonec                 C  s   d S rJ   r?   )r;   otherr   r?   r?   r@   r      s    z%TimedeltaArray._check_compatible_withTrv   c                 C  s4   t |}|jdkr"t| j||dS tjj| ||dS )Nrj   r   )r$   rm   r   re   r}   ZDatetimeLikeArrayMixinr   )r;   rf   rv   r?   r?   r@   r   '  s    
zTimedeltaArray.astypec           	      c  s   | j dkr(tt| D ]}| | V  qnd| j}t| }d}|| d }t|D ]<}|| }t|d | |}t||| dd}|E d H  qNd S )Nr   i'  TZbox)ndimrangelenre   minr   )	r;   ir   length	chunksizechunksZstart_iZend_iZ	convertedr?   r?   r@   __iter__3  s    
zTimedeltaArray.__iter__r   )axisrf   outkeepdimsinitialskipna	min_countz
int | NonezNpDtype | Noneint)r   rf   r   r   r   c          	      C  s6   t d||||d tj| j|||d}| ||S )Nr?   )rf   r   r   r   )r   r   r   )nvZvalidate_sumr&   Znansumre   Z_wrap_reduction_result)	r;   r   rf   r   r   r   r   r   r=   r?   r?   r@   sumF  s        zTimedeltaArray.sumr   )r   rf   r   ddofr   r   )r   rf   r   r   r   c                C  sR   t jd|||ddd tj| j|||d}|d ks>| jdkrH| |S | |S )Nr?   )rf   r   r   std)fname)r   r   r   r   )r   Zvalidate_stat_ddof_funcr&   Znanstdre   r   rd   Z_from_backing_data)r;   r   rf   r   r   r   r   r=   r?   r?   r@   r   Z  s    
 
 
zTimedeltaArray.std)boxedc                 C  s   ddl m} || ddS )Nr   get_format_timedelta64Tr   )pandas.io.formats.formatr   )r;   r   r   r?   r?   r@   
_formatterp  s    zTimedeltaArray._formatter)na_repdate_formatznpt.NDArray[np.object_]c                K  s,   ddl m} || j|}t|dd| jS )Nr   r   r   )r   r   re   rl   Z
frompyfunc)r;   r   r   kwargsr   	formatterr?   r?   r@   _format_native_typesu  s    z#TimedeltaArray._format_native_typesc                 C  s2   t |trttdt|j dt| j d S )Nzcannot add the type z to a )rk   r   rn   	TypeErrorro   rC   r;   r   r?   r?   r@   _add_offset  s    zTimedeltaArray._add_offset__mul__c                   s   t rH| j }d }| jd k	r2ts2| j }t| j||j|dS tds\t	t
t
| kr~tjs~tdtjr| j  fddtt
| D }t	|}t| j||jdS | j }t| j||jdS )Nr{   rf   z$Cannot multiply with unequal lengthsc                   s   g | ]} | |  qS r?   r?   r   nZarrr   r?   r@   
<listcomp>  s     z*TimedeltaArray.__mul__.<locals>.<listcomp>rf   )r!   re   rP   r%   ro   rq   rf   hasattrrl   arrayr   r#   r   r    r   )r;   r   r=   rP   r?   r   r@   r     s"    






zTimedeltaArray.__mul____truediv__c                   s  t || jrNt|}td|tkrDtj| jtjd}|	tj
 |S | j| S t|r| j| }d }| jd k	r| jj| }t|}t| j||j|dS t|dst|}t|t| krtdnt|jr| j| S t|jr|  |   fddttD }t|| j}tj|dd	}|d
kr^| }t| ||j}n*|dkrt|t }n|dkr| tj
 }|S | j| }t| j||jdS d S )Nr^   r   r{   rf   *Cannot divide vectors with unequal lengthsc                   s   g | ]}|  |  qS r?   r?   r   ZoravZsravr?   r@   r     s     z.TimedeltaArray.__truediv__.<locals>.<listcomp>Fr   r   Zfloatingdatetime)!rk   _recognized_scalarsr   r   r	   rl   emptyshaper4   fillnanre   r   r!   rP   deltar   ro   rq   rf   r   r   r   r   r#   r    ravelr   reshapeinfer_dtyper   r   float)r;   r   r=   rP   result_listinferredZflatr?   r   r@   r     sH    













zTimedeltaArray.__truediv____rtruediv__c                   s
  t  jrNt  td tkrDtjjtjd}|	tj
 |S  j S t rxtdt j dtj t dst  t tkrtdn`t jr j S t jr fddttD }t|S td j d	tj d S )
Nr^   r   Cannot divide  by rf   r   c                   s   g | ]} | |  qS r?   r?   r   r   r;   r?   r@   r     s     z/TimedeltaArray.__rtruediv__.<locals>.<listcomp>z	 data by )rk   r   r   r   r	   rl   r   r   r4   r   r   re   r   r!   r   ro   rC   r   r   r   r   r#   rf   r    r   )r;   r   r=   r   r?   r   r@   r     s.    








zTimedeltaArray.__rtruediv____floordiv__c           
        s"  t |rt|| jrXt|}td|tkrLtj| jtj	d}|
tj |S || jS | j| }d }| jd k	r| j| }|jdkr| jjdkrd }t| ||dS t|dst|}t|t| krtdnJt|jr.t| |}| j|j }| j|jB }| r*|tj	}t||tj |S t|jr|  |   fddttD }t|}t j!|d	d
}|"| j}|dkrt#|\}}t| |S |dkr| tj S |S t$|jst%|jr| j| }t| |S t&|dt|j'}	t(d|	 dt| j' d S )Nr^   r   r   rP   rf   "Cannot divide with unequal lengthsc                   s   g | ]}|  |  qS r?   r?   r   r   r?   r@   r   Q  s     z/TimedeltaArray.__floordiv__.<locals>.<listcomp>Fr   r   r   r   r   ))r!   rk   r   r   r   r	   rl   r   r   r4   r   r   __rfloordiv__re   rP   Znanosro   r   r   r   r   r#   rf   r7   _isnanr   r   putmaskr    r   r   Zasarrayr   r   r   r|   r   r   getattrrC   r   )
r;   r   r=   rP   maskZres_listZresult_flatr   r   rf   r?   r   r@   r     sZ    










zTimedeltaArray.__floordiv__r   c                   sb  t  rxt jrXt  td tkrLtjjtj	d}|
tj |S  jS tdt j dtj t dst  t tkrtdnt jrt   jj }j jB }| r|tj	}t||tj |S t jr2 fddttD }t|}|S t dt j}td| dtj d S )	Nr^   r   r   r   rf   r   c                   s   g | ]} | |  qS r?   r?   r   r   r?   r@   r     s     z0TimedeltaArray.__rfloordiv__.<locals>.<listcomp>)r!   rk   r   r   r   r	   rl   r   r   r4   r   r   r   re   r   ro   rC   r   r   r   r   r#   rf   r7   r   r   r   r   r    r   r   )r;   r   r=   r   r   rf   r?   r   r@   r   i  s:    




zTimedeltaArray.__rfloordiv____mod__c                 C  s$   t || jrt|}| | | |  S rJ   rk   r   r   r   r?   r?   r@   r     s    zTimedeltaArray.__mod____rmod__c                 C  s$   t || jrt|}|||  |   S rJ   r   r   r?   r?   r@   r     s    zTimedeltaArray.__rmod__
__divmod__c                 C  s0   t || jrt|}| | }| ||  }||fS rJ   r   r;   r   Zres1Zres2r?   r?   r@   r     s
    zTimedeltaArray.__divmod____rdivmod__c                 C  s0   t || jrt|}||  }|||   }||fS rJ   r   r   r?   r?   r@   r     s
    zTimedeltaArray.__rdivmod__c                 C  s2   | j d k	r"t| | j | j  dS t| | j S Nr   )rP   ro   re   rL   r?   r?   r@   __neg__  s    
zTimedeltaArray.__neg__c                 C  s   t | | j | jdS r   )ro   re   rv   rP   rL   r?   r?   r@   __pos__  s    zTimedeltaArray.__pos__c                 C  s   t | t| jS rJ   )ro   rl   absre   rL   r?   r?   r@   __abs__  s    zTimedeltaArray.__abs__znpt.NDArray[np.float64]c                 C  s   t | j}| j| j| ddS )a  
        Return total duration of each element expressed in seconds.

        This method is available directly on TimedeltaArray, TimedeltaIndex
        and on Series containing timedelta values under the ``.dt`` namespace.

        Returns
        -------
        seconds : [ndarray, Float64Index, Series]
            When the calling object is a TimedeltaArray, the return type
            is ndarray.  When the calling object is a TimedeltaIndex,
            the return type is a Float64Index. When the calling object
            is a Series, the return type is Series of type `float64` whose
            index is the same as the original.

        See Also
        --------
        datetime.timedelta.total_seconds : Standard library version
            of this method.
        TimedeltaIndex.components : Return a DataFrame with components of
            each Timedelta.

        Examples
        --------
        **Series**

        >>> s = pd.Series(pd.to_timedelta(np.arange(5), unit='d'))
        >>> s
        0   0 days
        1   1 days
        2   2 days
        3   3 days
        4   4 days
        dtype: timedelta64[ns]

        >>> s.dt.total_seconds()
        0         0.0
        1     86400.0
        2    172800.0
        3    259200.0
        4    345600.0
        dtype: float64

        **TimedeltaIndex**

        >>> idx = pd.to_timedelta(np.arange(5), unit='d')
        >>> idx
        TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'],
                       dtype='timedelta64[ns]', freq=None)

        >>> idx.total_seconds()
        Float64Index([0.0, 86400.0, 172800.0, 259200.0, 345600.0],
                     dtype='float64')
        N)r5   )r   r8   r:   r7   )r;   Zppsr?   r?   r@   rY     s    7
zTimedeltaArray.total_secondsc                 C  s
   t | jS )z
        Return an ndarray of datetime.timedelta objects.

        Returns
        -------
        timedeltas : ndarray[object]
        )r   re   rL   r?   r?   r@   rX     s    zTimedeltaArray.to_pytimedeltaz Number of days for each element.z>Number of seconds (>= 0 and less than 1 day) for each element.zFNumber of microseconds (>= 0 and less than 1 second) for each element.zJNumber of nanoseconds (>= 0 and less than 1 microsecond) for each element.r+   c                   sj   ddl m} ddddddd	g | j}|r6 fd
dndd |fdd| D  d}|sf|d}|S )a"  
        Return a DataFrame of the individual resolution components of the Timedeltas.

        The components (days, hours, minutes seconds, milliseconds, microseconds,
        nanoseconds) are returned as columns in a DataFrame.

        Returns
        -------
        DataFrame
        r   r*   rR   hoursminutesrS   ZmillisecondsrT   rU   c                   s   t | rtjgt  S | jS rJ   )r%   rl   r   r   
componentsr_   columnsr?   r@   rA   9  s    z$TimedeltaArray.components.<locals>.fc                 S  s   | j S rJ   )r   r   r?   r?   r@   rA   @  s    c                   s   g | ]} |qS r?   r?   r   )rA   r?   r@   r   C  s     z-TimedeltaArray.components.<locals>.<listcomp>r   int64)pandasr+   r9   r   )r;   r+   Zhasnansr=   r?   )r   rA   r@   r     s"    	
zTimedeltaArray.components)N)F)F)T)F)FrC   
__module____qualname__rD   Z_typrl   rI   Z_internal_fill_valuer   r   r   r#   Z_is_recognized_dtypeZ_infer_matchesrE   rM   Z__array_priority__rN   __annotations__rO   rQ   rV   rW   r]   rd   rf   rr   r   Z_default_dtypeclassmethodri   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r   __rmul__r   r   r   r   r   r   r   r   r   r   r   rY   rX   rF   rR   rS   rT   rU   r   __classcell__r?   r?   rs   r@   rG   Q   s   

  $$ 
E
+
L
/


	
	:
rG   Fraiserw   ztuple[np.ndarray, Tick | None]rx   c                 C  sn  |dkst d}|dk	r t|}tj| |dd\} }t| trD| j}t| jsXt	| jrlt
| ||d} d}nt| jrt| |d\} }|o| }nt| jrt| }t|pd\}}| tj}	| |	 }
|rt|
|}
|	| |
| tj d	} t| |< d}n<t| jr2| jtkrDt| td
} d}ntd| j dtj| |d} | jdksft | | |fS )a  
    Parameters
    ----------
    data : list-like
    copy : bool, default False
    unit : str, optional
        The timedelta unit to treat integers as multiples of. For numeric
        data this defaults to ``'ns'``.
        Must be un-specified if the data contains a str and ``errors=="raise"``.
    errors : {"raise", "coerce", "ignore"}, default "raise"
        How to handle elements that cannot be converted to timedelta64[ns].
        See ``pandas.to_timedelta`` for details.

    Returns
    -------
    converted : numpy.ndarray
        The sequence converted to a numpy array with dtype ``timedelta64[ns]``.
    inferred_freq : Tick or None
        The inferred frequency of the sequence.

    Raises
    ------
    ValueError : Data cannot be converted to timedelta64[ns].

    Notes
    -----
    Unlike `pandas.to_timedelta`, if setting ``errors=ignore`` will not cause
    errors to be ignored; they are caught and subsequently ignored at a
    higher level.
    r   NrG   )Zcls_namerz   errorsF)rz   rH   timedelta64[ns]r   dtype ' cannot be converted to timedelta64[ns]r   r   )rn   r   r}   Z!ensure_arraylike_for_datetimelikerk   rG   rP   r    rf   r"   _objects_to_td64nsr   ints_to_td64nsr   rl   isnanr   r   r   rZ   ra   r   r#   r   r   r   r   )r   rv   rz   r  r   	copy_mader   rj   pbasefracr?   r?   r@   r|   M  sF    !  



r|   rH   c                 C  sr   d}|dk	r|nd}| j tjkr0| tj} d}|dkr`d| d}| |} t| td} d}n
| d} | |fS )	a  
    Convert an ndarray with integer-dtype to timedelta64[ns] dtype, treating
    the integers as multiples of the given timedelta unit.

    Parameters
    ----------
    data : numpy.ndarray with integer-dtype
    unit : str, default "ns"
        The timedelta unit to treat integers as multiples of.

    Returns
    -------
    numpy.ndarray : timedelta64[ns] array converted from data
    bool : whether a copy was made
    FNrH   Tztimedelta64[]r   r  )rf   rl   r   r   ra   r   r   )r   rz   r	  Z	dtype_strr?   r?   r@   r    s    

r  c                 C  s*   t j| t jdd}t|||d}|dS )aR  
    Convert a object-dtyped or string-dtyped array into an
    timedelta64[ns]-dtyped array.

    Parameters
    ----------
    data : ndarray or Index
    unit : str, default "ns"
        The timedelta unit to treat integers as multiples of.
        Must not be specified if the data contains a str.
    errors : {"raise", "coerce", "ignore"}, default "raise"
        How to handle elements that cannot be converted to timedelta64[ns].
        See ``pandas.to_timedelta`` for details.

    Returns
    -------
    numpy.ndarray : timedelta64[ns] array converted from data

    Raises
    ------
    ValueError : Data cannot be converted to timedelta64[ns].

    Notes
    -----
    Unlike `pandas.to_timedelta`, if setting `errors=ignore` will not cause
    errors to be ignored; they are caught and subsequently ignored at a
    higher level.
    Fru   r  r  )rl   r   Zobject_r   ra   )r   rz   r  r<   r=   r?   r?   r@   r    s    r  r   r1   c                 C  sB   t | } t| tdr$d}t|t| ts>td|  d| S )NrI   zhPassing in 'timedelta' dtype with no precision is not allowed. Please pass in 'timedelta64[ns]' instead.r  r  )r$   r   rl   rf   r   r   )rf   msgr?   r?   r@   rg     s    
rg   )FNr   )rH   )Nr   )K
__future__r   r   r   typingr   r   Znumpyrl   Zpandas._libsr   r   Zpandas._libs.tslibsr   r	   r
   r   r   r   r   r   r   Zpandas._libs.tslibs.conversionr   Zpandas._libs.tslibs.fieldsr   Zpandas._libs.tslibs.timedeltasr   r   r   Zpandas._typingr   r   r   Zpandas.compat.numpyr   r   Zpandas.util._validatorsr   Zpandas.core.dtypes.astyper   Zpandas.core.dtypes.commonr   r   r   r   r    r!   r"   r#   r$   Zpandas.core.dtypes.missingr%   Zpandas.corer&   Zpandas.core.arraysr'   r}   Zpandas.core.arrays._rangesr(   Zpandas.core.commoncorecommonr   Zpandas.core.ops.commonr)   r   r+   rF   ZTimelikeOpsrG   r|   r  r  rg   r?   r?   r?   r@   <module>   sH   ,,           W
(
$