o
    ҷh                  
   @  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mZ d d	lmZ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&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z: d dl;m<Z<m=Z= d dl>m?Z? d dl@mAZAmBZBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZMmNZNmOZO d dlPmQZQ d dlRmSZS d dlTmUZU erd dlVmWZW d dlXmYZY d dlZm[Z[ d dl\m]Z]m^Z^ ee_e`e+f Zaeebecf Zdeedeejef Zfeefeaf Zgee_ed e`edd f e+f ZhG d!d" d"ed#d$ZiG d%d& d&eid'd$Zjeejd(f Zkd)Zlddd.d/Zm	ddd8d9Zndd?d@Zo	dddGdHZp	dddKdLZqddPdQZr		'		R			#dddXdYZsdd[d\Ztdd]d^Zud_d` Zve	 	 	 	 	 	 	 	 	 	 dddddeZwe	 	 	 	 	 	 	 	 	 	 dddgdeZwe	 	 	 	 	 	 	 	 	 	 dddjdeZwdRd'd'd'dejxdejxdkd#f
ddqdeZwi drdrdsdrdtdtdudtdvdvdwdvdxdydzdyd{d|d}d|d~ddddddddddddddddddZydddZzdddZ{g dZ|dS )    )annotations)abc)date)partial)islice)TYPE_CHECKINGCallable	TypedDictUnioncastoverloadN)libtslib)
OutOfBoundsDatetime	Timedelta	Timestampastype_overflowsafeget_unit_from_dtypeiNaTis_supported_unitnat_stringsparsing	timezones)precision_from_unit)DateParseErrorguess_datetime_format)array_strptime)AnyArrayLike	ArrayLikeDateTimeErrorChoicesnpt)find_stack_level)ensure_objectis_float
is_integeris_integer_dtypeis_list_likeis_numeric_dtype)
ArrowDtypeDatetimeTZDtype)ABCDataFrame	ABCSeries)notna)DatetimeArrayIntegerArrayNumpyExtensionArray)
algorithms)unique)ArrowExtensionArray)ExtensionArray)maybe_convert_dtypeobjects_to_datetime64ns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__ rI   rI   N/var/www/html/venv/lib/python3.10/site-packages/pandas/core/tools/datetimes.pyr?   l   s   
 r?   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nsNrD   rI   rI   rI   rJ   rL   r   s   
 rL   Fr=   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rW      zCould 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!   )arrrW   r`   first_non_nan_elementguessed_formatrI   rI   rJ    _guess_datetime_format_for_array   s   ri   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)]r]   z+unique_share must be in next bounds: (0; 1))lenstart_caching_atsetr   	TypeError)rk   rm   ro   
do_cachingunique_elementsrI   rI   rJ   should_cache   s.   $ry   formatcacheconvert_listliker   r>   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   r>   dtypeF)indexcopy)pandasr>   objectry   
isinstancenpndarrayr3   r8   r+   arrayr1   rs   r   r   	is_unique
duplicated)rk   rz   r{   r|   r>   cache_arrayunique_datescache_datesrI   rI   rJ   _maybe_cache   s$   


r   dt_arrayr   utcnameHashable | Noner8   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   r   )r   is_np_dtyper   r9   r8   )r   r   r   r   rI   rI   rJ   _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   r}   r~   Fr   r   )r   r>   r   r   mapr   _values)rk   r   r   r>   resultrI   rI   rJ   _convert_and_box_cache'  s   r   r   
np.ndarrayrb   c           	      C  s   t jt| td}t }t|D ]1}||k}t| | |}|r2|jdu r,|d}n|	d}n|
  s=|| |||< qt|dkrQtjdtt d t||dS )a  
    Return results from array_strptime if a %z or %Z directive was passed.

    Parameters
    ----------
    result : ndarray[int64]
        int64 date representations of the dates
    timezones : ndarray
        pytz timezone objects
    utc : bool
        Whether to convert/localize timestamps to UTC.
    name : string, default None
        Name for a DatetimeIndex

    Returns
    -------
    tz_result : Index-like of parsed dates with timezone
    r~   Nr   r]   a0  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`r^   r   )r   emptyrs   r   ru   r1   r-   tz_localizetzinfo
tz_convertisnaalladdrc   rd   FutureWarningr!   r8   )	r   r   r   r   
tz_resultsnon_na_timezoneszonemaskdtarI   rI   rJ   _return_parsed_timezone_resultsA  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|rt | 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rtt|	stt| td	|d
kd} t | tt	fst	| |
|dS |r| dS | S |dur|durtdt| ||||S t| dddkrt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r;|dkr;t'| |||||S t(| ||||dd\}}|dur[t|t)|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
    Or~   r   Nr   r   UTCr   zM8[s]coerce)	is_coercez#cannot specify both format and unitndimr]   zAarg must be a string, datetime, list, tuple, 1-d array, or SeriesF)r   r   NaTzdatetime64[ns]r   ignorer\   mixedT)rW   r   r   r   allow_objectr   ),r   listtupler   r   r/   getattrr)   r-   r9   r   r   r(   ra   r   r8   r   r2   pyarrow_dtyper   _dt_tz_convert_dt_tz_localizer   r   r   r   r   asarrayr   
ValueError_to_datetime_with_unitrv   r4   libtimezonesmaybe_get_tzrepeatrs   r"   ri   _array_strptime_with_fallbackr5   r6   _simple_newr   )rk   rz   r   r   r   r   rW   r   r   	arg_dtyper   	arg_array_npvaluesidxr   	tz_parsedr   rI   rI   rJ   _convert_listlike_datetimesq  s   &









	


	r   fmtc                 C  sD   t | ||||d\}}tdd |D rt||||S t|||dS )zL
    Call array_strptime, with fallback behavior depending on 'errors'.
    )r   r   r   c                 s  s    | ]}|d uV  qd S NrI   ).0r   rI   rI   rJ   	<genexpr>  s    z0_array_strptime_with_fallback.<locals>.<genexpr>r   )r   anyr   r   )rk   r   r   r   r   r   r   r   rI   rI   rJ   r     s   r   c              	   C  s  t | dd} t| tr| d| d}d}nt| } | 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}nn| jjdkrt|\}}t| | tkB }	| | jddd}
d|
|	< |
tjjk  s|
tjjk r|d
kr| t
} t| ||||S t	d| d|
jd	dd}tdd||	< d}n| jt
dd} tj| ||d\}}|dkrt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[]NiuFr   M8[ns]r   ff8r   z cannot convert input with unit ''r   rU   r   r   r   r   r   )r7   r   r.   astyper   r   r   kindr   r   r   r   r   isnanr   r   min_valuer   max
datetime64r   array_with_unit_to_datetimer8   _with_inferr9   r   r   r   )rk   r   r   r   r   rf   r   multr   r   fvaluesr   rI   rI   rJ   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rtd| d|t d }	|	td|d }
t| rt| tttjfst| } | |
 } | 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 specified)r   zorigin z is Out of Boundsz# cannot be converted to a Timestampzorigin offset z must be tz-naiver]   )r   to_julian_dater   rv   r   r   r   r   r   r$   r#   r'   r   r   r   r&   r   r+   r8   r   )rk   originr   originalj0errj_maxj_minoffset	td_offsetioffsetrI   rI   rJ   _adjust_to_originV  sh   #


r   DatetimeScalarinfer_datetime_formatr   c                 C     d S r   rI   rk   r   rW   r   r   rz   r   r   r   r   r{   rI   rI   rJ   to_datetime     r   Series | DictConvertiblec                 C  r   r   rI   r   rI   rI   rJ   r     r    list | tuple | Index | ArrayLiker9   c                 C  r   r   rI   r   rI   rI   rJ   r     r   unix2DatetimeScalarOrArrayConvertible | 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u r dS |	dkr*t| |	|} tt||||||d}t	| t
rQ| }|rO| jdurJ| d}|S | d}|S t	| tryt| ||
|}|jsg| |}|S || j|}| j|| j| jd	}|S t	| ttjfrt| ||}|S t	| trt| ||
|}|jst| || jd
}|S || || jd
}|S t| rz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st||}|S |||}|S |t"(| g|d }t	| t)rt	|t"j*rt)|}|S )as;  
    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 millisecond difference
          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**

    If a date does not meet the `timestamp limitations
    <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
    #timeseries-timestamp-limits>`_, passing ``errors='ignore'``
    will return the original input instead of raising any exception.

    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='ignore')
    '13000101'
    >>> 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'zThe 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.r^   Nr   )r   r   rW   r   r   r   r   )r   r   r   r>   r   r   r}   r~   )+r   
no_defaultr   rc   rd   r!   r   r   r   r   r   r   r   r   r+   r   r   r   r   _constructorr   r   r*   r   MutableMapping_assemble_from_unit_mappingsr8   r   r&   r   r
   r   r   r3   r   r   r   r   r>   r   r   rq   bool_)rk   r   rW   r   r   rz   r   r   r   r   r{   r|   r   r   valuesargcr>   rI   rI   rJ   r     s     `



1
/

+(&
" 	

	rA   yearsrB   monthsrC   daysrM   hrN   rO   mrP   rQ   srR   rS   millisecondmillisecondsrT   microsecondrU   )microsecondsrU   
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 rz|||| | | 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   )r=   
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)valuerI   rI   rJ   r     s
   z'_assemble_from_unit_mappings.<locals>.fc                   s   i | ]}| |qS rI   rI   )r   k)r   rI   rJ   
<dictcomp>      z0_assemble_from_unit_mappings.<locals>.<dictcomp>c                 S  s   i | ]\}}||qS rI   rI   )r   r  vrI   rI   rJ   r    r  )rA   rB   rC   ,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 | r| jddd} | S )Nr   int64Fr   )r%   r   )r	  )r   r  rI   rJ   r     s   z,_assemble_from_unit_mappings.<locals>.coercerA   '  rB   d   rC   z%Y%m%d)rz   r   r   zcannot assemble the datetimes: N)r  r  r  rS   rT   rU   )r   r   zcannot assemble the datetimes [z]: )r   r=   r  r  columnsr   r   keysitemssortedru   rs   joinr  r	  r   rv   get)rk   r   r   r=   r  r   unit_revrequiredreq	_requiredexcess_excessr   r	  r   unitsur  rI   )r   r   r  rJ   r    sf   





r  npt.NDArray[np.object_]np.ndarray | Nonec              
     s   fdd  fdd}z	 |  tjW S  tttfy!   Y nw z|  tj}||t|W S  tttfy<   Y nw zt	| t
t }|| |W S  tttfyY   Y dS w )a*  
    try to parse the YYYYMMDD/%Y%m%d format, try to deal with NaT-like,
    arg is a passed in as an object dtype, but could really be ints/strings
    with nan-like/or floats (e.g. with nan)

    Parameters
    ----------
    arg : np.ndarray[object]
    errors : {'raise','ignore','coerce'}
    c                   s>   | j tdd} t| d | d d | d }tj| dd S )NFr   r"  r#  r   r   )r   r   r   try_parse_year_month_dayr   array_to_datetime)cargparsedr   rI   rJ   calc  s
   z_attempt_YYYYMMDD.<locals>.calcc                   sR   t j| jdd}|d}t|| <  | | t jt j}|d||< |S )Nr   r~   i8)r   r   shapeviewr   r   float64r!  )r6  r   r   iresultmasked_result)r8  rI   rJ   calc_with_mask  s   

z)_attempt_YYYYMMDD.<locals>.calc_with_maskN)r   r   r!  r   OverflowErrorrv   r<  r,   r0   isinr   r   )rk   r   r?  r6  r   rI   )r8  r   rJ   _attempt_YYYYMMDD  s(   
rB  )r   ry   r   )F)rW   rX   rY   rZ   )rj   N)rk   rl   rm   rn   ro   rp   rY   rq   )
rk   rl   rz   rZ   r{   rq   r|   r   rY   r>   )FN)r   r   r   rq   r   r   rY   r8   r   )rk   r   r   r>   r   r   rY   r8   )r   r   r   rq   r   rb   rY   r8   )NFNr   NNT)rz   rZ   r   r   r   rq   r   rZ   r   r   rW   rX   r   rX   r   rq   )
r   rq   r   rb   r   rq   r   rb   rY   r8   )r   rq   r   rb   rY   r8   )
..........)rk   r   r   r   rW   rq   r   rq   r   rq   rz   rZ   r   rq   r   rZ   r   rq   r{   rq   rY   r   )rk   r   r   r   rW   rq   r   rq   r   rq   rz   rZ   r   rq   r   rZ   r   rq   r{   rq   rY   r>   )rk   r   r   r   rW   rq   r   rq   r   rq   rz   rZ   r   rq   r   rZ   r   rq   r{   rq   rY   r9   )rk   r   r   r   rW   rq   r   rq   r   rq   rz   rZ   r   r   r   rZ   r   r  r   rb   r{   rq   rY   r  )r   r   r   rq   )rk   r2  r   rb   rY   r3  )}
__future__r   collectionsr   datetimer   	functoolsr   	itertoolsr   typingr   r   r	   r
   r   r   rc   numpyr   pandas._libsr   r   pandas._libs.tslibsr   r   r   r   r   r   r   r   r   r   r   pandas._libs.tslibs.conversionr   pandas._libs.tslibs.parsingr   r   pandas._libs.tslibs.strptimer   pandas._typingr   r   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.core.dtypes.missingr,   pandas.arraysr-   r.   r/   pandas.corer0   pandas.core.algorithmsr1   pandas.core.arraysr2   pandas.core.arrays.baser3   pandas.core.arrays.datetimesr4   r5   r6   pandas.core.constructionr7   pandas.core.indexes.baser8   pandas.core.indexes.datetimesr9   collections.abcr:   pandas._libs.tslibs.nattyper;   pandas._libs.tslibs.timedeltasr<   r   r=   r>   r   r   rl   rn   rb   Scalarr   r   r   r@   r?   rL   DictConvertiblert   ri   ry   r   r   r   r   r   r   r   r   r   r  r  r  rB  __all__rI   rI   rI   rJ   <module>   s8    0 
<3 
3 

HH   7	


^4