o
    5c                     @  sr   d Z ddlmZ ddlZddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZ dddZ	ddddZdddZdS )zj
Helper functions to generate range-like data for DatetimeArray
(and possibly TimedeltaArray/PeriodArray)
    )annotationsN)i8max)
BaseOffsetOutOfBoundsDatetime	Timedelta	TimestampiNaT)nptstartTimestamp | Timedelta | Noneendperiods
int | Nonefreqr   returnnpt.NDArray[np.intp]c              	   C  sv  | dur| j nd}|dur|j nd}|j}|du r4|dur4|dur4|}||| | |  |d  d }n,|durG|durG|}t|||dd}n|dur\|dur\|| }t|||dd}ntdtjdd	K ztj|||tjd
}	W n- ty   |g}
|
d |kr|
	|
d |  |
d |kstj
|
dd tjd
}	Y n	w W d   |	S W d   |	S 1 sw   Y  |	S )a%  
    Generate a range of dates or timestamps with the spans between dates
    described by the given `freq` DateOffset.

    Parameters
    ----------
    start : Timedelta, Timestamp or None
        First point of produced date range.
    end : Timedelta, Timestamp or None
        Last point of produced date range.
    periods : int or None
        Number of periods in produced date range.
    freq : Tick
        Describes space between dates in produced date range.

    Returns
    -------
    ndarray[np.int64] Representing nanoseconds.
    N      r
   )sider   zEat least 'start' or 'end' should be specified if a 'period' is given.raiseover)dtype)valuenanos_generate_range_overflow_safe
ValueErrornperrstatearangeint64FloatingPointErrorappendarray)r
   r   r   r   istartiendstridebevaluesxdr r,   P/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/arrays/_ranges.pygenerate_regular_range   sB   "




r.   endpointintr'   r   strc                 C  sr  |dv sJ t t}d| d|  d| }t jdd) zt |t t | }W n ty= } zt||d}~ww W d   n1 sHw   Y  t ||kr[t| |||S | dkrg|d	krg|dkss| dk rw|d
krw|dkrwt||d
kr| |kr| | |krt| | |d ||S |d }|| }	d|	  k r|k sn J |	|| |ft| |||}
t|
|	||S )a[  
    Calculate the second endpoint for passing to np.arange, checking
    to avoid an integer overflow.  Catch OverflowError and re-raise
    as OutOfBoundsDatetime.

    Parameters
    ----------
    endpoint : int
        nanosecond timestamp of the known endpoint of the desired range
    periods : int
        number of periods in the desired range
    stride : int
        nanoseconds between periods in the desired range
    side : {'start', 'end'}
        which end of the range `endpoint` refers to

    Returns
    -------
    other_end : int

    Raises
    ------
    OutOfBoundsDatetime
    r
   r   Cannot generate range with = and periods=r   r   Nr   r
   r   r   r   )	r   uint64r   r   absr"   r   $_generate_range_overflow_safe_signedr   )r/   r   r'   r   i64maxmsgaddenderrmid_periods	remainingmidpointr,   r,   r-   r   N   s>   

&r   c              
   C  s6  |dv sJ |dkr|d9 }t jddr t |t | }zt | | }|tkr-t|W W  d   S  ttfyA   Y nw |dkrJ| dksT|dk rR| dksTJ |dkrt | t | }t t}||ksmJ ||t | kr|W  d   S W d   n1 sw   Y  td| d	|  d
| )z
    A special case for _generate_range_overflow_safe where `periods * stride`
    can be calculated without overflowing int64 bounds.
    r2   r   r   r   r   Nr   r3   r4   r5   )	r   r   r!   r   OverflowErrorr"   r6   r   r   )r/   r   r'   r   r;   resultr9   r,   r,   r-   r8      s6   $
 $r8   )
r
   r   r   r   r   r   r   r   r   r   )r
   )
r/   r0   r   r0   r'   r0   r   r1   r   r0   )__doc__
__future__r   numpyr   pandas._libs.libr   pandas._libs.tslibsr   r   r   r   r   pandas._typingr	   r.   r   r8   r,   r,   r,   r-   <module>   s    
;C