o
    ôT·jVª  ã                
   @  sô  d dl mZ d dl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 d dlZd dl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  d dl!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZFmGZGmHZH d dlImJZJ d dlKmLZL d dlMmNZN erìd dlOmPZP d dlQmRZR d dlSmTZT d dlUmVZVmWZW eeXeYe)f ZZee[e\f Z]ee]eej^f Z_ee_eZf Z`eeXe] eYe]df e)f ZaG d d!„ d!ed"d#�ZbG d$d%„ d%ebd&d#�Zceecd'f Zdd(Zed†d‡d-d.„Zf	dˆd‰d7d8„ZgdŠd>d?„Zh	d‹dŒdFdG„Zi	d�dŽdJdK„Zj		&		L			"d�d�dRdS„Zkd‘dVdW„Zld’dXdY„ZmdZd[„ Zne										d“d”d_d`„ƒZoe										d“d•dbd`„ƒZoe										d“d–ded`„ƒZodLd&d&d&dejpdejpdfd"f
d—dld`„Zoi dmdm“dndm“dodo“dpdo“dqdq“drdq“dsdt“dudt“dvdw“dxdw“dydz“d{dz“d|d|“d}d|“d~d|“dd“d€d“dd�d�d�d‚œ¥Zqd˜dƒd„„Zrg d…¢ZsdS )™é    )Úannotations)Úabc)Údate)Úpartial)Úislice)ÚTYPE_CHECKINGÚCallableÚ	TypedDictÚUnionÚcastÚoverloadN)Úusing_string_dtype)ÚlibÚtslib)ÚOutOfBoundsDatetimeÚ	TimedeltaÚ	TimestampÚastype_overflowsafeÚis_supported_dtypeÚ	timezones)Úcast_from_unit_vectorized)ÚDateParseErrorÚguess_datetime_format)Úarray_strptime)ÚAnyArrayLikeÚ	ArrayLikeÚDateTimeErrorChoices)Úfind_stack_level)Úensure_objectÚis_floatÚ
is_integerÚis_integer_dtypeÚis_list_likeÚis_numeric_dtype)Ú
ArrowDtypeÚDatetimeTZDtype)ÚABCDataFrameÚ	ABCSeries)ÚDatetimeArrayÚIntegerArrayÚNumpyExtensionArray)Úunique)ÚArrowExtensionArray)ÚExtensionArray)Úmaybe_convert_dtypeÚobjects_to_datetime64Útz_to_dtype)Úextract_array)ÚIndex)ÚDatetimeIndex)ÚHashable)ÚNaTType)ÚUnitChoices)Ú	DataFrameÚSeries.c                   @  s&   e Zd ZU ded< ded< ded< dS )ÚYearMonthDayDictÚDatetimeDictArgÚyearÚmonthÚdayN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© rC   rC   ú^/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/pandas/core/tools/datetimes.pyr9   g   s   
 r9   T)Útotalc                   @  sV   e Zd ZU ded< ded< ded< ded< ded< ded< ded< ded	< ded
< dS )ÚFulldatetimeDictr:   ÚhourÚhoursÚminuteÚminutesÚsecondÚsecondsÚmsÚusÚnsNr>   rC   rC   rC   rD   rF   m   s   
 rF   Fr7   é2   Údayfirstúbool | NoneÚreturnú
str | Nonec                 C  sn   t  | ¡ }dkr5t| |  }ƒtu r5t||d�}|d ur|S t  | |d d … ¡dkr5tjdttƒ d� d S )Néÿÿÿÿ©rQ   é   zªCould not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.©Ú
stacklevel)	r   Úfirst_non_nullÚtypeÚstrr   ÚwarningsÚwarnÚUserWarningr   )ÚarrrQ   rZ   Úfirst_non_nan_elementÚguessed_formatrC   rC   rD   Ú _guess_datetime_format_for_array€   s   ÿûrc   çffffffæ?ÚargÚArrayConvertibleÚunique_shareÚfloatÚcheck_countú
int | NoneÚboolc                 C  sÔ   d}|du rt | ƒtkrdS t | ƒdkrt | ƒd }nd}nd|  kr-t | ƒks2J dƒ‚ J dƒ‚|dkr8dS d|  k rEd	k sJJ d
ƒ‚ J d
ƒ‚z	tt| |ƒƒ}W n
 ty]   Y dS w t |ƒ|| krhd}|S )a  
    Decides whether to do caching.

    If the percent of unique elements among `check_count` elements less
    than `unique_share * 100` then we can do caching.

    Parameters
    ----------
    arg: listlike, tuple, 1-d array, Series
    unique_share: float, default=0.7, optional
        0 < unique_share < 1
    check_count: int, optional
        0 <= check_count <= len(arg)

    Returns
    -------
    do_caching: bool

    Notes
    -----
    By default for a sequence of less than 50 items in size, we don't do
    caching; for the number of elements less than 5000, we take ten percent of
    all elements to check for a uniqueness share; if the sequence size is more
    than 5000, then we check only the first 500 elements.
    All constants were chosen empirically by.
    TNFiˆ  é
   iô  r   z1check_count must be in next bounds: [0; len(arg)]rW   z+unique_share must be in next bounds: (0; 1))ÚlenÚstart_caching_atÚsetr   Ú	TypeError)re   rg   ri   Ú
do_cachingÚunique_elementsrC   rC   rD   Úshould_cache—   s.   ÿÿ$ÿrs   ÚformatÚcacheÚconvert_listliker   r8   c                 C  s¬   ddl m} |td�}|rTt| ƒs|S t| tjttt	fƒs"t 
| ¡} t| ƒ}t|ƒt| ƒk rT|||ƒ}z	|||dd�}W n tyG   | Y S w |jjsT||j ¡   }|S )aÉ  
    Create a cache of unique dates from an array of dates

    Parameters
    ----------
    arg : listlike, tuple, 1-d array, Series
    format : string
        Strftime format to parse time
    cache : bool
        True attempts to create a cache of converted values
    convert_listlike : function
        Conversion function to apply on dates

    Returns
    -------
    cache_array : Series
        Cache of converted, unique dates. Can be empty
    r   ©r8   ©ÚdtypeF)ÚindexÚcopy)Úpandasr8   Úobjectrs   Ú
isinstanceÚnpÚndarrayr-   r2   r'   Úarrayr+   rm   r   rz   Ú	is_uniqueÚ
duplicated)re   rt   ru   rv   r8   Úcache_arrayÚunique_datesÚcache_datesrC   rC   rD   Ú_maybe_cacheÓ   s$   


ÿr‡   Údt_arrayr   ÚutcÚnameúHashable | Noner2   c                 C  s8   t  | jd¡r|rdnd}t| ||d�S t| || jd�S )a  
    Properly boxes the ndarray of datetimes to DatetimeIndex
    if it is possible or to generic Index instead

    Parameters
    ----------
    dt_array: 1-d array
        Array of datetimes to be wrapped in an Index.
    utc : bool
        Whether to convert/localize timestamps to UTC.
    name : string, default None
        Name for a resulting index

    Returns
    -------
    result : datetime of converted dates
        - DatetimeIndex if convertible to sole datetime64 type
        - general Index otherwise
    ÚMr‰   N©ÚtzrŠ   )rŠ   ry   )r   Úis_np_dtypery   r3   r2   )rˆ   r‰   rŠ   rŽ   rC   rC   rD   Ú_box_as_indexlike  s   r�   Ú DatetimeScalarOrArrayConvertibler„   c                 C  s2   ddl m} || |jjd� |¡}t|jd|d�S )a  
    Convert array of dates with a cache and wrap the result in an Index.

    Parameters
    ----------
    arg : integer, float, string, datetime, list, tuple, 1-d array, Series
    cache_array : Series
        Cache of converted, unique dates
    name : string, default None
        Name for a DatetimeIndex

    Returns
    -------
    result : Index-like of converted dates
    r   rw   rx   F©r‰   rŠ   )r|   r8   rz   ry   Úmapr�   Ú_values)re   r„   rŠ   r8   ÚresultrC   rC   rD   Ú_convert_and_box_cache"  s   r–   ÚraiseÚunitÚerrorsr   Ú	yearfirstÚexactc	                 C  sò  t | ttfƒrtj| dd�} n
t | tƒrt | ¡} t| ddƒ}	|r#dnd}
t |	tƒrDt | tt	fƒs8t	| |
|d�S |rB|  
d¡ d¡} | S t |	tƒr†|	jtu r†|r„t | tƒrrtt| jƒ}|	jjdurg| d¡}n| d¡}t|ƒ} | S |	jjdur|  d¡} | S |  d¡} | S t |	d¡r¶t|	ƒsŸtt | ¡t d	¡|d
kd�} t | tt	fƒs­t	| |
|d�S |r´|  d¡S | S |durÊ|durÂtdƒ‚t| ||||ƒS t| ddƒdkrÖtdƒ‚zt| dt  !|
¡d�\} }W n2 t�y   |d
k�rtjdgdd� "t#| ƒ¡}t	||d� Y S |dk�rt| |d�}| Y S ‚ w t$| ƒ} |du �r&t%| |d�}|du�r9|dk�r9t&| |||||ƒS t'| ||||dd�\}}|du�rrt (|j¡d }ttt)||ƒƒ}| *d|j+› d�¡}tj,||d�}t	j,||d�S t-|||d�S )a  
    Helper function for to_datetime. Performs the conversions of 1D listlike
    of dates

    Parameters
    ----------
    arg : list, tuple, ndarray, Series, Index
        date to be parsed
    name : object
        None or string for the Index name
    utc : bool
        Whether to convert/localize timestamps to UTC.
    unit : str
        None or string of the frequency of the passed data
    errors : str
        error handing behaviors from to_datetime, 'raise', 'coerce', 'ignore'
    dayfirst : bool
        dayfirst parsing behavior from to_datetime
    yearfirst : bool
        yearfirst parsing behavior from to_datetime
    exact : bool, default True
        exact format matching behavior from to_datetime

    Returns
    -------
    Index-like of parsed dates
    ÚOrx   ry   Nr‰   r�   ÚUTCrŒ   zM8[s]Úcoerce)Ú	is_coercez#cannot specify both format and unitÚndimrW   zAarg must be a string, datetime, list, tuple, 1-d array, or SeriesF)r{   rŽ   ÚNaTzdatetime64[ns]©rŠ   ÚignorerV   ÚmixedT)rQ   rš   r‰   r™   Úallow_objectr   úM8[ú]r’   ).r~   ÚlistÚtupler   r�   r*   Úgetattrr%   r(   r3   Ú
tz_convertÚtz_localizer$   r[   r   r2   r   r,   Úpyarrow_dtyperŽ   Ú_dt_tz_convertÚ_dt_tz_localizer   r�   r   r   Úasarrayry   Ú
ValueErrorÚ_to_datetime_with_unitrp   r.   ÚlibtimezonesÚmaybe_get_tzÚrepeatrm   r   rc   Ú_array_strptime_with_fallbackr/   Údatetime_datar0   Úviewr˜   Ú_simple_newr�   )re   rt   rŠ   r‰   r˜   r™   rQ   rš   r›   Ú	arg_dtyperŽ   Ú	arg_arrayÚ_ÚnpvaluesÚidxr•   Ú	tz_parsedÚout_unitry   Údt64_valuesÚdtarC   rC   rD   Ú_convert_listlike_datetimes<  sš   &




ü

ÿü
ÿ

ù	

ú
	rÃ   Úfmtr\   c                 C  sÒ   t | ||||d�\}}|dur1t |j¡d }t||d�}	tj||	d�}
|r+|
 d¡}
t|
|d�S |jt	krM|rMt |j¡d }t|d|› d	�|d
�}|S t
ƒ ra|jt	krat |¡rat|d|d
�S t||j|d
�S )zL
    Call array_strptime, with fallback behavior depending on 'errors'.
    )r›   r™   r‰   Nr   )rŽ   r˜   rx   r�   r¢   r¦   z, UTC])ry   rŠ   r\   )r   r   r·   ry   r%   r(   r¹   r«   r2   r}   r   r   Úis_string_array)re   rŠ   r‰   rÄ   r›   r™   r•   Útz_outr˜   ry   rÂ   ÚresrC   rC   rD   r¶   Ê  s    

r¶   c              
   C  sæ  t | dd�} t| tƒr|  d|› d�¡}d}n¦t | ¡} | jjdv rX| jd|› d�dd�}zt|t d	¡dd�}W n t	yT   |d
krE‚ |  t
¡} t| ||||ƒ Y S w d}ne| jjdkr¬tjd
d��8 zt| |d�}W n' t	y”   |d
krŒt|  t
¡||||ƒ Y W  d  ƒ S t	d|› d�ƒ‚w W d  ƒ n1 sŸw   Y  | d	¡}d}n| jt
dd�} tj| ||d�\}}|dkrÉtj||d�}nt||d�}t|tƒsÖ|S | d¡ |¡}|rñ|jdu rì| d¡}|S | d¡}|S )zF
    to_datetime specalized to the case where a 'unit' is passed.
    T)Úextract_numpyzdatetime64[r§   NÚiuF©r{   zM8[ns]r—   Úf)Úover©r˜   z cannot convert input with unit 'ú'©r™   r£   r¢   r�   r‰   )r1   r~   r)   Úastyper   r°   ry   Úkindr   r   r}   r²   Úerrstater   r¸   r   Úarray_with_unit_to_datetimer2   Ú_with_inferr3   r¬   r«   rŽ   )re   r˜   rŠ   r‰   r™   r`   r¿   r•   rC   rC   rD   r²   ç  s`   


üÿû
ÿûÿþ




ÿr²   c              
   C  s   |dkrQ| }t dƒ ¡ }|dkrtdƒ‚z| | } W n ty+ } ztdƒ|‚d}~ww t j ¡ | }t j ¡ | }t | |k¡sHt | |k ¡rOt|› d�ƒ‚| S t	| ƒskt
| ƒsktt | ¡ƒsktd| › d	|› d
�ƒ‚zt ||d�}W n) tyˆ } z	td|› d�ƒ|‚d}~w tyœ } z	td|› d�ƒ|‚d}~ww |jdurªtd|› d�ƒ‚|t dƒ }	|	td|d� }
t| ƒrÊt| tttjfƒsÊt | ¡} | |
 } | S )aŽ  
    Helper function for to_datetime.
    Adjust input argument to the specified origin

    Parameters
    ----------
    arg : list, tuple, ndarray, Series, Index
        date to be adjusted
    origin : 'julian' or Timestamp
        origin offset for the arg
    unit : str
        passed unit from to_datetime, must be 'D'

    Returns
    -------
    ndarray or scalar of adjusted date(s)
    Újulianr   ÚDz$unit must be 'D' for origin='julian'z3incompatible 'arg' type for given 'origin'='julian'Nz% is Out of Bounds for origin='julian'rÎ   z!' is not compatible with origin='z+'; it must be numeric with a unit specifiedrÍ   zorigin z is Out of Boundsz# cannot be converted to a Timestampzorigin offset z must be tz-naiverW   )r   Úto_julian_dater±   rp   ÚmaxÚminr   Úanyr   r    r   r#   r°   rŽ   r   r"   r~   r'   r2   r€   )re   Úoriginr˜   ÚoriginalÚj0ÚerrÚj_maxÚj_minÚoffsetÚ	td_offsetÚioffsetrC   rC   rD   Ú_adjust_to_origin+  sh   ÿþ€ÿÿ#ãÿÿÿÿ€
ÿþ€ÿ

rä   ÚDatetimeScalarÚinfer_datetime_formatr   c                 C  ó   d S ©NrC   ©re   r™   rQ   rš   r‰   rt   r›   r˜   ræ   rÛ   ru   rC   rC   rD   Úto_datetimes  ó   rê   úSeries | DictConvertiblec                 C  rç   rè   rC   ré   rC   rC   rD   rê   „  rë   ú list | tuple | Index | ArrayLiker3   c                 C  rç   rè   rC   ré   rC   rC   rD   rê   •  rë   Úunixú2DatetimeScalarOrArrayConvertible | DictConvertibleúbool | lib.NoDefaultúlib.NoDefault | boolrÛ   ú8DatetimeIndex | Series | DatetimeScalar | NaTType | Nonec              	   C  s>  |t jur|dv rtdƒ‚|t jurtjdtƒ d� |dkr'tjdttƒ d� | du r-dS |	dkr7t| |	|ƒ} tt	||||||d	�}t
| tƒr^| }|r\| jdurW|  d
¡}|S |  d
¡}|S t
| tƒr†t| ||
|ƒ}|jst|  |¡}|S || j|ƒ}| j|| j| jd�}|S t
| ttjfƒr–t| ||ƒ}|S t
| tƒr¹t| ||
|ƒ}|js¯t| || jd�}|S || || jd�}|S t| ƒ�rzttt t!t"t#j$dtf | ƒ}t|||
|ƒ}W n t%yï   |dkrá‚ ddl&m'} |g t(d�}Y nw |jsút||ƒ}|S |||ƒ}|S |t# )| g¡|ƒd }t
| t*ƒ�rt
|t#j+ƒ�rt*|ƒ}|S )a7:  
    Convert argument to datetime.

    This function converts a scalar, array-like, :class:`Series` or
    :class:`DataFrame`/dict-like to a pandas datetime object.

    Parameters
    ----------
    arg : int, float, str, datetime, list, tuple, 1-d array, Series, DataFrame/dict-like
        The object to convert to a datetime. If a :class:`DataFrame` is provided, the
        method expects minimally the following columns: :const:`"year"`,
        :const:`"month"`, :const:`"day"`. The column "year"
        must be specified in 4-digit format.
    errors : {'ignore', 'raise', 'coerce'}, default 'raise'
        - If :const:`'raise'`, then invalid parsing will raise an exception.
        - If :const:`'coerce'`, then invalid parsing will be set as :const:`NaT`.
        - If :const:`'ignore'`, then invalid parsing will return the input.
    dayfirst : bool, default False
        Specify a date parse order if `arg` is str or is list-like.
        If :const:`True`, parses dates with the day first, e.g. :const:`"10/11/12"`
        is parsed as :const:`2012-11-10`.

        .. warning::

            ``dayfirst=True`` is not strict, but will prefer to parse
            with day first.

    yearfirst : bool, default False
        Specify a date parse order if `arg` is str or is list-like.

        - If :const:`True` parses dates with the year first, e.g.
          :const:`"10/11/12"` is parsed as :const:`2010-11-12`.
        - If both `dayfirst` and `yearfirst` are :const:`True`, `yearfirst` is
          preceded (same as :mod:`dateutil`).

        .. warning::

            ``yearfirst=True`` is not strict, but will prefer to parse
            with year first.

    utc : bool, default False
        Control timezone-related parsing, localization and conversion.

        - If :const:`True`, the function *always* returns a timezone-aware
          UTC-localized :class:`Timestamp`, :class:`Series` or
          :class:`DatetimeIndex`. To do this, timezone-naive inputs are
          *localized* as UTC, while timezone-aware inputs are *converted* to UTC.

        - If :const:`False` (default), inputs will not be coerced to UTC.
          Timezone-naive inputs will remain naive, while timezone-aware ones
          will keep their time offsets. Limitations exist for mixed
          offsets (typically, daylight savings), see :ref:`Examples
          <to_datetime_tz_examples>` section for details.

        .. warning::

            In a future version of pandas, parsing datetimes with mixed time
            zones will raise an error unless `utc=True`.
            Please specify `utc=True` to opt in to the new behaviour
            and silence this warning. To create a `Series` with mixed offsets and
            `object` dtype, please use `apply` and `datetime.datetime.strptime`.

        See also: pandas general documentation about `timezone conversion and
        localization
        <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
        #time-zone-handling>`_.

    format : str, default None
        The strftime to parse time, e.g. :const:`"%d/%m/%Y"`. See
        `strftime documentation
        <https://docs.python.org/3/library/datetime.html
        #strftime-and-strptime-behavior>`_ for more information on choices, though
        note that :const:`"%f"` will parse all the way up to nanoseconds.
        You can also pass:

        - "ISO8601", to parse any `ISO8601 <https://en.wikipedia.org/wiki/ISO_8601>`_
          time string (not necessarily in exactly the same format);
        - "mixed", to infer the format for each element individually. This is risky,
          and you should probably use it along with `dayfirst`.

        .. note::

            If a :class:`DataFrame` is passed, then `format` has no effect.

    exact : bool, default True
        Control how `format` is used:

        - If :const:`True`, require an exact `format` match.
        - If :const:`False`, allow the `format` to match anywhere in the target
          string.

        Cannot be used alongside ``format='ISO8601'`` or ``format='mixed'``.
    unit : str, default 'ns'
        The unit of the arg (D,s,ms,us,ns) denote the unit, which is an
        integer or float number. This will be based off the origin.
        Example, with ``unit='ms'`` and ``origin='unix'``, this would calculate
        the number of milliseconds to the unix epoch start.
    infer_datetime_format : bool, default False
        If :const:`True` and no `format` is given, attempt to infer the format
        of the datetime strings based on the first non-NaN element,
        and if it can be inferred, switch to a faster method of parsing them.
        In some cases this can increase the parsing speed by ~5-10x.

        .. deprecated:: 2.0.0
            A strict version of this argument is now the default, passing it has
            no effect.

    origin : scalar, default 'unix'
        Define the reference date. The numeric values would be parsed as number
        of units (defined by `unit`) since this reference date.

        - If :const:`'unix'` (or POSIX) time; origin is set to 1970-01-01.
        - If :const:`'julian'`, unit must be :const:`'D'`, and origin is set to
          beginning of Julian Calendar. Julian day number :const:`0` is assigned
          to the day starting at noon on January 1, 4713 BC.
        - If Timestamp convertible (Timestamp, dt.datetime, np.datetimt64 or date
          string), origin is set to Timestamp identified by origin.
        - If a float or integer, origin is the difference
          (in units determined by the ``unit`` argument) relative to 1970-01-01.
    cache : bool, default True
        If :const:`True`, use a cache of unique, converted dates to apply the
        datetime conversion. May produce significant speed-up when parsing
        duplicate date strings, especially ones with timezone offsets. The cache
        is only used when there are at least 50 values. The presence of
        out-of-bounds values will render the cache unusable and may slow down
        parsing.

    Returns
    -------
    datetime
        If parsing succeeded.
        Return type depends on input (types in parenthesis correspond to
        fallback in case of unsuccessful timezone or out-of-range timestamp
        parsing):

        - scalar: :class:`Timestamp` (or :class:`datetime.datetime`)
        - array-like: :class:`DatetimeIndex` (or :class:`Series` with
          :class:`object` dtype containing :class:`datetime.datetime`)
        - Series: :class:`Series` of :class:`datetime64` dtype (or
          :class:`Series` of :class:`object` dtype containing
          :class:`datetime.datetime`)
        - DataFrame: :class:`Series` of :class:`datetime64` dtype (or
          :class:`Series` of :class:`object` dtype containing
          :class:`datetime.datetime`)

    Raises
    ------
    ParserError
        When parsing a date from string fails.
    ValueError
        When another datetime conversion error happens. For example when one
        of 'year', 'month', day' columns is missing in a :class:`DataFrame`, or
        when a Timezone-aware :class:`datetime.datetime` is found in an array-like
        of mixed time offsets, and ``utc=False``.

    See Also
    --------
    DataFrame.astype : Cast argument to a specified dtype.
    to_timedelta : Convert argument to timedelta.
    convert_dtypes : Convert dtypes.

    Notes
    -----

    Many input types are supported, and lead to different output types:

    - **scalars** can be int, float, str, datetime object (from stdlib :mod:`datetime`
      module or :mod:`numpy`). They are converted to :class:`Timestamp` when
      possible, otherwise they are converted to :class:`datetime.datetime`.
      None/NaN/null scalars are converted to :const:`NaT`.

    - **array-like** can contain int, float, str, datetime objects. They are
      converted to :class:`DatetimeIndex` when possible, otherwise they are
      converted to :class:`Index` with :class:`object` dtype, containing
      :class:`datetime.datetime`. None/NaN/null entries are converted to
      :const:`NaT` in both cases.

    - **Series** are converted to :class:`Series` with :class:`datetime64`
      dtype when possible, otherwise they are converted to :class:`Series` with
      :class:`object` dtype, containing :class:`datetime.datetime`. None/NaN/null
      entries are converted to :const:`NaT` in both cases.

    - **DataFrame/dict-like** are converted to :class:`Series` with
      :class:`datetime64` dtype. For each row a datetime is created from assembling
      the various dataframe columns. Column keys can be common abbreviations
      like ['year', 'month', 'day', 'minute', 'second', 'ms', 'us', 'ns']) or
      plurals of the same.

    The following causes are responsible for :class:`datetime.datetime` objects
    being returned (possibly inside an :class:`Index` or a :class:`Series` with
    :class:`object` dtype) instead of a proper pandas designated type
    (:class:`Timestamp`, :class:`DatetimeIndex` or :class:`Series`
    with :class:`datetime64` dtype):

    - when any input element is before :const:`Timestamp.min` or after
      :const:`Timestamp.max`, see `timestamp limitations
      <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
      #timeseries-timestamp-limits>`_.

    - when ``utc=False`` (default) and the input is an array-like or
      :class:`Series` containing mixed naive/aware datetime, or aware with mixed
      time offsets. Note that this happens in the (quite frequent) situation when
      the timezone has a daylight savings policy. In that case you may wish to
      use ``utc=True``.

    Examples
    --------

    **Handling various input formats**

    Assembling a datetime from multiple columns of a :class:`DataFrame`. The keys
    can be common abbreviations like ['year', 'month', 'day', 'minute', 'second',
    'ms', 'us', 'ns']) or plurals of the same

    >>> df = pd.DataFrame({'year': [2015, 2016],
    ...                    'month': [2, 3],
    ...                    'day': [4, 5]})
    >>> pd.to_datetime(df)
    0   2015-02-04
    1   2016-03-05
    dtype: datetime64[ns]

    Using a unix epoch time

    >>> pd.to_datetime(1490195805, unit='s')
    Timestamp('2017-03-22 15:16:45')
    >>> pd.to_datetime(1490195805433502912, unit='ns')
    Timestamp('2017-03-22 15:16:45.433502912')

    .. warning:: For float arg, precision rounding might happen. To prevent
        unexpected behavior use a fixed-width exact type.

    Using a non-unix epoch origin

    >>> pd.to_datetime([1, 2, 3], unit='D',
    ...                origin=pd.Timestamp('1960-01-01'))
    DatetimeIndex(['1960-01-02', '1960-01-03', '1960-01-04'],
                  dtype='datetime64[ns]', freq=None)

    **Differences with strptime behavior**

    :const:`"%f"` will parse all the way up to nanoseconds.

    >>> pd.to_datetime('2018-10-26 12:00:00.0000000011',
    ...                format='%Y-%m-%d %H:%M:%S.%f')
    Timestamp('2018-10-26 12:00:00.000000001')

    **Non-convertible date/times**

    Passing ``errors='coerce'`` will force an out-of-bounds date to :const:`NaT`,
    in addition to forcing non-dates (or non-parseable dates) to :const:`NaT`.

    >>> pd.to_datetime('13000101', format='%Y%m%d', errors='coerce')
    NaT

    .. _to_datetime_tz_examples:

    **Timezones and time offsets**

    The default behaviour (``utc=False``) is as follows:

    - Timezone-naive inputs are converted to timezone-naive :class:`DatetimeIndex`:

    >>> pd.to_datetime(['2018-10-26 12:00:00', '2018-10-26 13:00:15'])
    DatetimeIndex(['2018-10-26 12:00:00', '2018-10-26 13:00:15'],
                  dtype='datetime64[ns]', freq=None)

    - Timezone-aware inputs *with constant time offset* are converted to
      timezone-aware :class:`DatetimeIndex`:

    >>> pd.to_datetime(['2018-10-26 12:00 -0500', '2018-10-26 13:00 -0500'])
    DatetimeIndex(['2018-10-26 12:00:00-05:00', '2018-10-26 13:00:00-05:00'],
                  dtype='datetime64[ns, UTC-05:00]', freq=None)

    - However, timezone-aware inputs *with mixed time offsets* (for example
      issued from a timezone with daylight savings, such as Europe/Paris)
      are **not successfully converted** to a :class:`DatetimeIndex`.
      Parsing datetimes with mixed time zones will show a warning unless
      `utc=True`. If you specify `utc=False` the warning below will be shown
      and a simple :class:`Index` containing :class:`datetime.datetime`
      objects will be returned:

    >>> pd.to_datetime(['2020-10-25 02:00 +0200',
    ...                 '2020-10-25 04:00 +0100'])  # doctest: +SKIP
    FutureWarning: In a future version of pandas, parsing datetimes with mixed
    time zones will raise an error unless `utc=True`. Please specify `utc=True`
    to opt in to the new behaviour and silence this warning. To create a `Series`
    with mixed offsets and `object` dtype, please use `apply` and
    `datetime.datetime.strptime`.
    Index([2020-10-25 02:00:00+02:00, 2020-10-25 04:00:00+01:00],
          dtype='object')

    - A mix of timezone-aware and timezone-naive inputs is also converted to
      a simple :class:`Index` containing :class:`datetime.datetime` objects:

    >>> from datetime import datetime
    >>> pd.to_datetime(["2020-01-01 01:00:00-01:00",
    ...                 datetime(2020, 1, 1, 3, 0)])  # doctest: +SKIP
    FutureWarning: In a future version of pandas, parsing datetimes with mixed
    time zones will raise an error unless `utc=True`. Please specify `utc=True`
    to opt in to the new behaviour and silence this warning. To create a `Series`
    with mixed offsets and `object` dtype, please use `apply` and
    `datetime.datetime.strptime`.
    Index([2020-01-01 01:00:00-01:00, 2020-01-01 03:00:00], dtype='object')

    |

    Setting ``utc=True`` solves most of the above issues:

    - Timezone-naive inputs are *localized* as UTC

    >>> pd.to_datetime(['2018-10-26 12:00', '2018-10-26 13:00'], utc=True)
    DatetimeIndex(['2018-10-26 12:00:00+00:00', '2018-10-26 13:00:00+00:00'],
                  dtype='datetime64[ns, UTC]', freq=None)

    - Timezone-aware inputs are *converted* to UTC (the output represents the
      exact same datetime, but viewed from the UTC time offset `+00:00`).

    >>> pd.to_datetime(['2018-10-26 12:00 -0530', '2018-10-26 12:00 -0500'],
    ...                utc=True)
    DatetimeIndex(['2018-10-26 17:30:00+00:00', '2018-10-26 17:00:00+00:00'],
                  dtype='datetime64[ns, UTC]', freq=None)

    - Inputs can contain both string or datetime, the above
      rules still apply

    >>> pd.to_datetime(['2018-10-26 12:00', datetime(2020, 1, 1, 18)], utc=True)
    DatetimeIndex(['2018-10-26 12:00:00+00:00', '2020-01-01 18:00:00+00:00'],
                  dtype='datetime64[ns, UTC]', freq=None)
    >   r¤   ÚISO8601z8Cannot use 'exact' when 'format' is 'mixed' or 'ISO8601'zùThe argument 'infer_datetime_format' is deprecated and will be removed in a future version. A strict version of it is now the default, see https://pandas.pydata.org/pdeps/0004-consistent-to-datetime-parsing.html. You can safely remove this argument.rX   r£   z’errors='ignore' is deprecated and will raise in a future version. Use to_datetime without passing `errors` and catch exceptions explicitly insteadNrî   )r‰   r˜   rQ   rš   r™   r›   r‰   )rz   rŠ   r¢   r8   r—   r   rw   rx   ),r   Ú
no_defaultr±   r]   r^   r   ÚFutureWarningrä   r   rÃ   r~   r   rŽ   r«   r¬   r'   r‡   Úemptyr“   r”   Ú_constructorrz   rŠ   r&   r   ÚMutableMappingÚ_assemble_from_unit_mappingsr2   r–   r"   r   r
   r¨   r©   r-   r   r€   r   r|   r8   r}   r�   rk   Úbool_)re   r™   rQ   rš   r‰   rt   r›   r˜   ræ   rÛ   ru   rv   r•   r„   ÚvaluesÚargcr8   rC   rC   rD   rê   ¦  s–     Y
úûù


1
Ñ/
Ò
+×(Ù&
Û"à 
áÿø	

÷	ùr;   Úyearsr<   Úmonthsr=   ÚdaysrG   ÚhrH   rI   ÚmrJ   rK   ÚsrL   rM   ÚmillisecondÚmillisecondsrN   ÚmicrosecondrO   )ÚmicrosecondsrO   Ú
nanosecondÚnanosecondsc                   sæ  ddl m}m‰m} || ƒ} | jjstdƒ‚dd„ ‰‡fdd„|  ¡ D ƒ}dd„ | ¡ D ƒ}g d	¢}t	t
|ƒt
| ¡ ƒ ƒ}t|ƒrOd
 |¡}	td|	› d�ƒ‚t	t
| ¡ ƒt
t ¡ ƒ ƒ}
t|
ƒrnd
 |
¡}td|› d�ƒ‚‡ ‡fdd„}|| |d  ƒd || |d  ƒd  || |d  ƒ }z
t|dˆ |d�}W n ttfy± } ztd|› �ƒ|‚d}~ww g d¢}|D ]8}| |¡}|durð|| v rðz|||| | ƒ|ˆ d�7 }W q¸ ttfyï } ztd|› d|› �ƒ|‚d}~ww q¸|S )a.  
    assemble the unit specified fields from the arg (DataFrame)
    Return a Series for actual parsing

    Parameters
    ----------
    arg : DataFrame
    errors : {'ignore', 'raise', 'coerce'}, default 'raise'

        - If :const:`'raise'`, then invalid parsing will raise an exception
        - If :const:`'coerce'`, then invalid parsing will be set as :const:`NaT`
        - If :const:`'ignore'`, then invalid parsing will return the input
    utc : bool
        Whether to convert/localize timestamps to UTC.

    Returns
    -------
    Series
    r   )r7   Ú
to_numericÚto_timedeltaz#cannot assemble with duplicate keysc                 S  s,   | t v rt |  S |  ¡ t v rt |  ¡  S | S rè   )Ú	_unit_mapÚlower)ÚvaluerC   rC   rD   rË   •  s
   z'_assemble_from_unit_mappings.<locals>.fc                   s   i | ]}|ˆ |ƒ“qS rC   rC   )Ú.0Úk)rË   rC   rD   Ú
<dictcomp>Ÿ  ó    z0_assemble_from_unit_mappings.<locals>.<dictcomp>c                 S  s   i | ]\}}||“qS rC   rC   )r  r  ÚvrC   rC   rD   r     r  )r;   r<   r=   ú,zNto assemble mappings requires at least that [year, month, day] be specified: [z] is missingz9extra keys have been passed to the datetime assemblage: [r§   c                   s(   ˆ| ˆ d�} t | jƒr| jddd�} | S )NrÏ   Úint64FrÊ   )r!   ry   rÐ   )rû   )r™   r	  rC   rD   rž   ´  s   
z,_assemble_from_unit_mappings.<locals>.coercer;   i'  r<   éd   r=   z%Y%m%d)rt   r™   r‰   zcannot assemble the datetimes: N)r   r  r  rM   rN   rO   )r˜   r™   zcannot assemble the datetimes [z]: )r|   r7   r	  r
  Úcolumnsr‚   r±   ÚkeysÚitemsÚsortedro   rm   Újoinr  rû   rê   rp   Úget)re   r™   r‰   r7   r
  r˜   Úunit_revÚrequiredÚreqÚ	_requiredÚexcessÚ_excessrž   rû   rÞ   ÚunitsÚur  rC   )r™   rË   r	  rD   rù   v  sf   

ÿÿ

ÿ
ÿþÿ€ÿ
ÿþ€ÿ€rù   )r   rs   rê   )F)rQ   rR   rS   rT   )rd   N)re   rf   rg   rh   ri   rj   rS   rk   )
re   rf   rt   rT   ru   rk   rv   r   rS   r8   )FN)rˆ   r   r‰   rk   rŠ   r‹   rS   r2   rè   )re   r‘   r„   r8   rŠ   r‹   rS   r2   )NFNr—   NNT)rt   rT   rŠ   r‹   r‰   rk   r˜   rT   r™   r   rQ   rR   rš   rR   r›   rk   )
r‰   rk   rÄ   r\   r›   rk   r™   r\   rS   r2   )r‰   rk   r™   r\   rS   r2   )
..........)re   rå   r™   r   rQ   rk   rš   rk   r‰   rk   rt   rT   r›   rk   r˜   rT   ræ   rk   ru   rk   rS   r   )re   rì   r™   r   rQ   rk   rš   rk   r‰   rk   rt   rT   r›   rk   r˜   rT   ræ   rk   ru   rk   rS   r8   )re   rí   r™   r   rQ   rk   rš   rk   r‰   rk   rt   rT   r›   rk   r˜   rT   ræ   rk   ru   rk   rS   r3   )re   rï   r™   r   rQ   rk   rš   rk   r‰   rk   rt   rT   r›   rð   r˜   rT   ræ   rñ   rÛ   r\   ru   rk   rS   rò   )r™   r   r‰   rk   )tÚ
__future__r   Úcollectionsr   Údatetimer   Ú	functoolsr   Ú	itertoolsr   Útypingr   r   r	   r
   r   r   r]   Únumpyr   Úpandas._configr   Úpandas._libsr   r   Úpandas._libs.tslibsr   r   r   r   r   r   r³   Úpandas._libs.tslibs.conversionr   Úpandas._libs.tslibs.parsingr   r   Úpandas._libs.tslibs.strptimer   Úpandas._typingr   r   r   Úpandas.util._exceptionsr   Úpandas.core.dtypes.commonr   r   r    r!   r"   r#   Úpandas.core.dtypes.dtypesr$   r%   Úpandas.core.dtypes.genericr&   r'   Úpandas.arraysr(   r)   r*   Úpandas.core.algorithmsr+   Úpandas.core.arraysr,   Úpandas.core.arrays.baser-   Úpandas.core.arrays.datetimesr.   r/   r0   Úpandas.core.constructionr1   Úpandas.core.indexes.baser2   Úpandas.core.indexes.datetimesr3   Úcollections.abcr4   Úpandas._libs.tslibs.nattyper5   Úpandas._libs.tslibs.timedeltasr6   r|   r7   r8   r¨   r©   rf   rh   r\   ÚScalarÚ
datetime64rå   r‘   r:   r9   rF   ÚDictConvertiblern   rc   rs   r‡   r�   r–   rÃ   r¶   r²   rä   rê   rô   r  rù   Ú__all__rC   rC   rC   rD   Ú<module>   s2      ÿ
<3ÿ ý÷ 

DHõõõõ   :ÿþýüûúùø	÷
öõôóòñðïë
^