
    hT                        d Z ddlm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 erddlmZ 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 dd	Z	 	 	 	 	 	 	 	 	 	 dd
Zy)zj
Helper functions to generate range-like data for DatetimeArray
(and possibly TimedeltaArray/PeriodArray)
    )annotations)TYPE_CHECKINGN)i8max)
BaseOffsetOutOfBoundsDatetime	Timedelta	TimestampiNaT)nptc                .   | | j                   nd}||j                   nd}|j                   t        |      }	 |j                  |d      }t        |j                         }	||||}
|
||
z
  |	z  |	z  z   |	dz  z   dz   }n:|||}
t        |
||	d	
      }n$||||	z   }t        |||	d
      }
nt	        d      t        j                  d      5  	 t        j                  |
||	t        j                        }ddd       |S # t        $ r}t	        d| d| d      |d}~ww xY w# t        $ rV |
g}|d   |k7  r |j                  |d   |	z          |d   |k7  r t        j                  |dd t        j                        }Y w xY w# 1 sw Y   S xY w)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.
    unit : str, default "ns"
        The resolution the output is meant to represent.

    Returns
    -------
    ndarray[np.int64]
        Representing the given resolution.
    NF)round_okzfreq=z is incompatible with unit=z,. Use a lower freq or a higher unit instead.      start)sideendzEat least 'start' or 'end' should be specified if a 'period' is given.raiseover)dtype)_valuenanosr   as_unit
ValueErrorint_generate_range_overflow_safenperrstatearangeint64FloatingPointErrorappendarray)r   r   periodsfrequnitistartiendtderrstridebevaluesxdrs                 ?D:\jyotish\venv\Lib\site-packages\pandas/core/arrays/_ranges.pygenerate_regular_ranger2      s   : #.U\\DF3::dDJJ	4BZZuZ- ^F6-$2B f$v--!;a?		 3)!Wf7K		g16M)!Wf5IS
 	
 
'	"	8YYq!V288<F	 
# MC  D64TF ;9 9
 	8 " 	8#Cb'Q,

3r7V+, b'Q,XXc#2hbhh7F		8 
# MsG   D F
'D(	D%D  D%(3F(FF
FF

Fc                   |dv sJ t        j                  t              }d| d|  d| }t        j                  d      5  	 t        j                  |      t        j                  t        j                  |            z  }	 ddd       t        j                        |k  rt        | |||      S | dkD  r
|d	k(  r|dkD  s| dcxk  r|k  rn n|d
k(  rt        |      |d
k(  r%| |z
  |cxk  r| k  rn nt        | |z
  |dz
  ||      S |dz  }||z
  }	d|	cxk  r|k  sn J |	|| |f       t        t        | |||            }
t        |
|	||      S # t
        $ r}t        |      |d}~ww xY w# 1 sw Y   xY w)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   )endpointr%   r,   r   i64maxmsgaddendr+   mid_periods	remainingmidpoints              r1   r   r   a   s   8 ####YYuF'vQxjgY
OC	'	"	4YYw'"))BFF6N*CCF	 
# 
vvf~3HgvtTT
Q,47?vz1v$%- "#&&	8f,AA -vw{FD
 	

 Q,K+%Iy"7"JY6$JJ"0;PTUVH(9fdKK5 " 	4%c*3	4 
#	"s*   E+>E	E(E##E((E++E4c                   |dv sJ |dk(  r|dz  }t        j                  d      5  t        j                  |      t        j                  |      z  }	 t        j                  |       |z   }|t        k(  rt        t        |      cddd       S # t        t        f$ r Y nw xY w|dkD  r| dk\  s|dk  r| dk  sJ |dkD  rzt        j                  |       t        j                  |      z   }t        j                  t              }||kD  sJ ||t        j                  |      z   k  rt        |      cddd       S ddd       n# 1 sw Y   nxY wt        d| d	|  d
|       )z
    A special case for _generate_range_overflow_safe where `periods * stride`
    can be calculated without overflowing int64 bounds.
    r4   r   r   r   r   Nr   r5   r6   r7   )
r   r   r!   r
   OverflowErrorr   r"   r8   r   r   )r;   r%   r,   r   r>   resulturesultr<   s           r1   r:   r:      sO    ####u}"	'	"'"RXXf%55	XXh'&0F~ $#v; 
#	" #M2 	 	 
x1}&1*QOOA:
 ii)BIIf,==GYYu%FV###&299V#4447|9 
#	"	"	"< 
%dV1XJmG9M s*   ,E1BB!E B!!BEE)ns)r   Timestamp | Timedelta | Noner   rG   r%   z
int | Noner&   r   r'   strreturnznpt.NDArray[np.intp])r   )
r;   r   r%   r   r,   r   r   rH   rI   r   )__doc__
__future__r   typingr   numpyr   pandas._libs.libr   pandas._libs.tslibsr   r   r   r	   r
   pandas._typingr   r2   r   r:        r1   <module>rS      s    #    "  " F'F	%F F 	F
 F FT ;B@L@L@L),@L47@L@LF+++),+47++rR   