o
    ҷh*                     @  s*  d Z ddlmZ ddlmZ ddlZddlmZm	Z	 ddl
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 ddlmZ ddlm  mZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ eriddl%m&Z& e$g dej' edde$g deG dd de"Z(						ddddddZ)dS ) z implement the TimedeltaIndex     )annotations)TYPE_CHECKINGN)indexlib)
Resolution	Timedelta	to_offset)find_stack_level)	is_scalarpandas_dtype)	ABCSeries)datetimelike)TimedeltaArray)Indexmaybe_extract_name)DatetimeTimedeltaMixin)inherit_names)DtypeObj)__neg____pos____abs__total_secondsroundfloorceilT)wrap)
componentsto_pytimedeltasumstdmedian_format_native_typesc                   @  s   e Zd ZU dZdZeZed"ddZde	d< e
jZed#d
dZddejejdddfd$ddZd%ddZdd Zd&ddZd'ddZed(d d!ZdS ))TimedeltaIndexa  
    Immutable Index of timedelta64 data.

    Represented internally as int64, and scalars returned Timedelta objects.

    Parameters
    ----------
    data : array-like (1-dimensional), optional
        Optional timedelta-like data to construct index with.
    unit : {'D', 'h', 'm', 's', 'ms', 'us', 'ns'}, optional
        The unit of ``data``.
    freq : str or pandas offset object, optional
        One of pandas date offset strings or corresponding objects. The string
        ``'infer'`` can be passed in order to set the frequency of the index as
        the inferred frequency upon creation.
    dtype : numpy.dtype or str, default None
        Valid ``numpy`` dtypes are ``timedelta64[ns]``, ``timedelta64[us]``,
        ``timedelta64[ms]``, and ``timedelta64[s]``.
    copy : bool
        Make a copy of input array.
    name : object
        Name to be stored in the index.

    Attributes
    ----------
    days
    seconds
    microseconds
    nanoseconds
    components
    inferred_freq

    Methods
    -------
    to_pytimedelta
    to_series
    round
    floor
    ceil
    to_frame
    mean

    See Also
    --------
    Index : The base pandas Index type.
    Timedelta : Represents a duration between two dates or times.
    DatetimeIndex : Index of datetime64 data.
    PeriodIndex : Index of Period data.
    timedelta_range : Create a fixed-frequency TimedeltaIndex.

    Notes
    -----
    To learn more about the frequency strings, please see `this link
    <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`__.

    Examples
    --------
    >>> pd.TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'])
    TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'],
                   dtype='timedelta64[ns]', freq=None)

    >>> pd.TimedeltaIndex([1, 2, 4, 8], unit='D')
    TimedeltaIndex(['1 days', '2 days', '4 days', '8 days'],
                   dtype='timedelta64[ns]', freq=None)

    We can also let pandas infer the frequency when possible.

    >>> pd.TimedeltaIndex(range(5), unit='D', freq='infer')
    TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'],
                   dtype='timedelta64[ns]', freq='D')
    timedeltaindexreturntype[libindex.TimedeltaEngine]c                 C  s   t jS N)libindexTimedeltaEngineself r+   Q/var/www/html/venv/lib/python3.10/site-packages/pandas/core/indexes/timedeltas.py_engine_type   s   zTimedeltaIndex._engine_typer   _dataResolution | Nonec                 C  s   | j jS r&   )r.   _resolution_objr)   r+   r+   r,   r0      s   zTimedeltaIndex._resolution_objNFcopyboolc           
      C  s&  |t jurtjd| j dtt d t||| }t|r"| 	| |dv r*t
d|d ur2t|}t|trR|t ju rR|d u sE||jkrR|rK| }| j||dS t|trs|t ju rs|d u rs|d u si||jkrs|ro| S | S tj|||||d}d }	|st|ttfr|j}	| j|||	dS )	NzThe 'closed' keyword in zD construction is deprecated and will be removed in a future version.)
stacklevel>   MYyzqUnits 'M', 'Y', and 'y' are no longer supported, as they do not represent unambiguous timedelta values durations.name)frequnitdtyper1   )r8   refs)r   
no_defaultwarningswarn__name__FutureWarningr	   r   r
   _raise_scalar_data_error
ValueErrorr   
isinstancer   r;   r1   _simple_newr"   _view_from_sequence_not_strictr   r   _references)
clsdatar:   r9   closedr;   r1   r8   tdarrr<   r+   r+   r,   __new__   sJ   





zTimedeltaIndex.__new__r;   r   c                 C  s   t |dS )zF
        Can we compare values of the given dtype to our own?
        m)r   is_np_dtype)r*   r;   r+   r+   r,   _is_comparable_dtype   s   z#TimedeltaIndex._is_comparable_dtypec              
   C  sN   |  | z
| jj|dd}W n ty  } zt||d}~ww t| |S )z
        Get integer location for requested label

        Returns
        -------
        loc : int, slice, or ndarray[int]
        F)unboxN)_check_indexing_errorr.   _validate_scalar	TypeErrorKeyErrorr   get_loc)r*   keyerrr+   r+   r,   rV      s   

zTimedeltaIndex.get_loclabelstrc                 C  s   t |}|d fS r&   )r   )r*   rY   parsedr+   r+   r,   _parse_with_reso   s   zTimedeltaIndex._parse_with_resor[   r   c                 C  s,   | |j}|t|j tdd }||fS )N   ns)r   resolution_stringr   r   )r*   resor[   lboundrboundr+   r+   r,   _parsed_string_to_bounds   s   z'TimedeltaIndex._parsed_string_to_boundsc                 C  s   dS )Ntimedelta64r+   r)   r+   r+   r,   inferred_type   s   zTimedeltaIndex.inferred_type)r$   r%   )r$   r/   )r1   r2   )r;   r   r$   r2   )rY   rZ   )r[   r   )r$   rZ   )r@   
__module____qualname____doc___typr   	_data_clspropertyr-   __annotations__r   _get_string_slicer0   r   r=   rM   rP   rV   r\   rc   re   r+   r+   r+   r,   r"   &   s0   
 H
A	

r"   )r:   periods
int | Noner:   
str | Noner$   c          	      C  sL   |du rt || |rd}t|\}}tj| |||||d}tj||dS )aS  
    Return a fixed frequency TimedeltaIndex with day as the default.

    Parameters
    ----------
    start : str or timedelta-like, default None
        Left bound for generating timedeltas.
    end : str or timedelta-like, default None
        Right bound for generating timedeltas.
    periods : int, default None
        Number of periods to generate.
    freq : str, Timedelta, datetime.timedelta, or DateOffset, default 'D'
        Frequency strings can have multiples, e.g. '5H'.
    name : str, default None
        Name of the resulting TimedeltaIndex.
    closed : str, default None
        Make the interval closed with respect to the given frequency to
        the 'left', 'right', or both sides (None).
    unit : str, default None
        Specify the desired resolution of the result.

        .. versionadded:: 2.0.0

    Returns
    -------
    TimedeltaIndex

    Notes
    -----
    Of the four parameters ``start``, ``end``, ``periods``, and ``freq``,
    exactly three must be specified. If ``freq`` is omitted, the resulting
    ``TimedeltaIndex`` will have ``periods`` linearly spaced elements between
    ``start`` and ``end`` (closed on both sides).

    To learn more about the frequency strings, please see `this link
    <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`__.

    Examples
    --------
    >>> pd.timedelta_range(start='1 day', periods=4)
    TimedeltaIndex(['1 days', '2 days', '3 days', '4 days'],
                   dtype='timedelta64[ns]', freq='D')

    The ``closed`` parameter specifies which endpoint is included.  The default
    behavior is to include both endpoints.

    >>> pd.timedelta_range(start='1 day', periods=4, closed='right')
    TimedeltaIndex(['2 days', '3 days', '4 days'],
                   dtype='timedelta64[ns]', freq='D')

    The ``freq`` parameter specifies the frequency of the TimedeltaIndex.
    Only fixed frequencies can be passed, non-fixed frequencies such as
    'M' (month end) will raise.

    >>> pd.timedelta_range(start='1 day', end='2 days', freq='6H')
    TimedeltaIndex(['1 days 00:00:00', '1 days 06:00:00', '1 days 12:00:00',
                    '1 days 18:00:00', '2 days 00:00:00'],
                   dtype='timedelta64[ns]', freq='6H')

    Specify ``start``, ``end``, and ``periods``; the frequency is generated
    automatically (linearly spaced).

    >>> pd.timedelta_range(start='1 day', end='5 days', periods=4)
    TimedeltaIndex(['1 days 00:00:00', '2 days 08:00:00', '3 days 16:00:00',
                    '5 days 00:00:00'],
                   dtype='timedelta64[ns]', freq=None)

    **Specify a unit**

    >>> pd.timedelta_range("1 Day", periods=3, freq="100000D", unit="s")
    TimedeltaIndex(['1 days 00:00:00', '100001 days 00:00:00',
                    '200001 days 00:00:00'],
                   dtype='timedelta64[s]', freq='100000D')
    ND)rK   r:   r7   )comany_nonedtlmaybe_infer_freqr   _generate_ranger"   rE   )	startendrn   r9   r8   rK   r:   _rL   r+   r+   r,   timedelta_range  s   Trz   )NNNNNN)rn   ro   r:   rp   r$   r"   )*rh   
__future__r   typingr   r>   pandas._libsr   r'   r   pandas._libs.tslibsr   r   r   pandas.util._exceptionsr	   pandas.core.dtypes.commonr
   r   pandas.core.dtypes.genericr   pandas.core.arraysr   rt   pandas.core.arrays.timedeltasr   pandas.core.commoncorecommonrr   pandas.core.indexes.baser   r    pandas.core.indexes.datetimeliker   pandas.core.indexes.extensionr   pandas._typingr   
_field_opsr"   rz   r+   r+   r+   r,   <module>   sN     N