o
    Eh                     @  s  d dl mZ d dlZd dlZd dlmZmZmZ d dlZd dlm	Z	m
Z
mZ d dl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 d dlZd dlmZ d dlmZmZ d d	l m!Z!m"Z" d d
l#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1  m2Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m1  m;  m<Z; e	rd dl=m>Z> d dl?m@Z@ d dlAmBZB i ZCdd ZDdfddZEejFdgddZGdhddZHdhdd ZIdid$d%ZJd&d' ZKG d(d) d)ejLZMG d*d+ d+eZNG d,d- d-ejOZPd.d/ ZQG d0d1 d1ejOZRG d2d3 d3ejSZTG d4d5 d5ejUZVG d6d7 d7ejWZXdjdkd;d<ZYdld>d?ZZdmdEdFZ[dndHdIZ\dodMdNZ]dpdRdSZ^ej_dqdVdWZ`ej_dqdXdYZaej_dqdZd[Zbej_dqd\d]Zcdrd^d_ZdG d`da daeZeG dbdc dceZfG ddde deeZgdS )s    )annotationsN)datetime	timedeltatzinfo)TYPE_CHECKINGAnycast)AutoLocator	FormatterLocator)nonsingular)lib)	Timestamp	to_offset)	FreqGroupperiods_per_day)Fnpt)is_floatis_float_dtype
is_integeris_integer_dtypeis_nested_list_like)IndexSeries
get_option)
date_range)PeriodPeriodIndexperiod_range)	Generator)Axis)
BaseOffsetc                  C  s4   t tfttftjtftjtftjtft	j
tfg} | S N)r   DatetimeConverterr   PeriodConverterpydtr   datetimeTimeConverternp
datetime64)pairs r-   Elib/python3.10/site-packages/pandas/plotting/_matplotlib/converter.py	get_pairsK   s   r/   funcr   returnc                   s    t   fdd}tt|S )z/
    Decorator applying pandas_converters.
    c                    s8   t    | i |W  d    S 1 sw   Y  d S r#   )pandas_converters)argskwargsr0   r-   r.   wrapper\   s   $z6register_pandas_matplotlib_converters.<locals>.wrapper)	functoolswrapsr   r   )r0   r6   r-   r5   r.   %register_pandas_matplotlib_convertersW   s   
r9   Generator[None, None, None]c                  c  sF    t d} | r
t  zdV  W | dkrt  dS dS | dkr"t  w w )z
    Context manager registering pandas' converters for a plot.

    See Also
    --------
    register_pandas_matplotlib_converters : Decorator that applies this.
    z'plotting.matplotlib.register_convertersNauto)r   register
deregister)valuer-   r-   r.   r2   d   s   	
r2   Nonec                  C  sP   t  } | D ] \}}|tjv rttj| |stj| }|t|< | tj|< qd S r#   )r/   munitsregistry
isinstance
_mpl_units)r,   type_clspreviousr-   r-   r.   r<   z   s   
r<   c                  C  sb   t  D ]\} }ttj| |u rtj|  qt D ]\}}t|tt	t
hvr.|tj|< qd S r#   )r/   typer@   rA   getpoprC   itemsr$   r%   r)   )rD   rE   unit	formatterr-   r-   r.   r=      s   
r=   tm	pydt.timefloatc                 C  s(   | j d | jd  | j | jd  }|S )Ni  <   @B )hourminutesecondmicrosecond)rM   tot_secr-   r-   r.   _to_ordinalf   s   $rW   c                 C  s6   t | trt| }t| S t | tjrt| S | S r#   )rB   strr   rW   r(   r&   )dZparsedr-   r-   r.   time2num   s   
rZ   c                   @  s4   e Zd Zedd ZedddZeddd	Zd
S )r)   c                 C  sf   t tjf}t| |st| st| rt| S t| tr | tS t| t	t
tjtfr1dd | D S | S )Nc                 S  s   g | ]}t |qS r-   )rZ   .0xr-   r-   r.   
<listcomp>   s    z)TimeConverter.convert.<locals>.<listcomp>)rX   r&   r(   rB   r   r   rZ   r   maplisttupler*   ndarray)r>   rK   axisvalid_typesr-   r-   r.   convert   s   


zTimeConverter.convertr1   munits.AxisInfo | Nonec                 C  s*   | dkrd S t  }t|}tj||ddS )Nr(   )majlocmajfmtlabel)r	   TimeFormatterr@   AxisInfo)rK   rc   rg   rh   r-   r-   r.   axisinfo   s
   zTimeConverter.axisinforX   c                 C  s   dS )Nr(   r-   )r]   rc   r-   r-   r.   default_units   s   zTimeConverter.default_unitsN)r1   rf   )r1   rX   )__name__
__module____qualname__staticmethodre   rl   rm   r-   r-   r-   r.   r)      s    

r)   c                   @  s"   e Zd ZdddZddd	d
ZdS )rj   r1   r?   c                 C  s
   || _ d S r#   )locs)selfrr   r-   r-   r.   __init__      
zTimeFormatter.__init__r   pos
int | NonerX   c                 C  s   d}t |}t|| d }|d }|d }t|d\}}t|d\}	}t|	d\}
}	|dkr:t|	||||S |dkrMt|	||||dd S |dkr[t|	||d	S t|	|d
S )a  
        Return the time of day as a formatted string.

        Parameters
        ----------
        x : float
            The time of day specified as seconds since 00:00 (midnight),
            with up to microsecond precision.
        pos
            Unused

        Returns
        -------
        str
            A string in HH:MM:SS.mmmuuu format. Microseconds,
            milliseconds and seconds are only displayed if non-zero.
        z%H:%M:%S.%frQ     rP      r   N%H:%M:%S%H:%M)introunddivmodr&   r(   strftime)rs   r]   rv   fmtsZmsusmsusmh_r-   r-   r.   __call__   s   zTimeFormatter.__call__Nr1   r?   r   rv   rw   r1   rX   )rn   ro   rp   rt   r   r-   r-   r-   r.   rj      s    
rj   c                   @  s$   e Zd Zedd Zedd ZdS )r%   c                   2   t | r fdd| D } | S t|  } | S )Nc                      g | ]	}t | qS r-   )r%   _convert_1dr\   vrc   unitsr-   r.   r^          z+PeriodConverter.convert.<locals>.<listcomp>)r   r%   r   )valuesr   rc   r-   r   r.   re      s
   zPeriodConverter.convertc                   s^  t  ds	tdttttjtjtj	f}t
  t
jddtd t
jddtd t| |s6t| s6t| rCt|  jW  d    S t| trV|  jjW  d    S t| trk|  fddW  d    S tj| d	d
dkrt|  jdjW  d    S t| tttjtfr fdd| D W  d    S W d    | S 1 sw   Y  | S )Nfreqz/Axis must have `freq` set to convert to Periodsignore#Period with BDay freq is deprecatedcategoryPeriodDtype\[B\] is deprecatedc                   s   t |  jS r#   get_datevaluer   )r]   rc   r-   r.   <lambda>  s    z-PeriodConverter._convert_1d.<locals>.<lambda>F)Zskipnaperiod)r   c                   s   g | ]}t | jqS r-   r   r[   r   r-   r.   r^     s    z/PeriodConverter._convert_1d.<locals>.<listcomp>)hasattr	TypeErrorrX   r   r   r&   r'   r(   r*   r+   warningscatch_warningsfilterwarningsFutureWarningrB   r   r   r   r   r   asfreqasi8r   r_   r   Zinfer_dtyper`   ra   rb   )r   r   rc   rd   r-   r   r.   r      sF   





zPeriodConverter._convert_1dN)rn   ro   rp   rq   re   r   r-   r-   r-   r.   r%      s
    
r%   c                 C  s   t | tr| |jS t | tttjtjt	j
frt| |jS t| s3t| s3t | t	jtfr5| jdkr5| S | d u r;d S td|  d)N   zUnrecognizable date '')rB   r   r   ordinalrX   r   r&   r'   r(   r*   r+   r   r   rb   r   size
ValueError)r'   r   r-   r-   r.   r     s   

r   c                   @  s2   e Zd Zedd Zedd Zedd	d
ZdS )r$   c                   r   )Nc                   r   r-   )r$   r   r   rc   rK   r-   r.   r^   %  r   z-DatetimeConverter.convert.<locals>.<listcomp>)r   r$   r   )r   rK   rc   r-   r   r.   re   !  s
   zDatetimeConverter.convertc                 C  s   dd }t | ttjtjtjfrt| S t	| st
| r| S t | tr(|| S t | tttjttfrot | tr<t| } t | trD| j} t | tjsOt| } t| sWt| rY| S zt| } W n	 tyi   Y nw t| } | S )Nc                 S  s*   z	t t| W S  ty   |  Y S w r#   )mdatesdate2numtoolsto_datetime	Exception)r   r-   r-   r.   	try_parse,  s
   z0DatetimeConverter._convert_1d.<locals>.try_parse)rB   r   r&   r'   r*   r+   r(   r   r   r   r   rX   r`   ra   rb   r   r   r   comZasarray_tuplesafer   r   r   r   r   )r   rK   rc   r   r-   r-   r.   r   *  s.   





zDatetimeConverter._convert_1drK   tzinfo | Noner1   munits.AxisInfoc                 C  sL   | }t |d}t||d}tddd}tddd}tj||d||fdS )z
        Return the :class:`~matplotlib.units.AxisInfo` for *unit*.

        *unit* is a tzinfo instance or None.
        The *axis* argument is required but not used.
        )tzi  r   i   )rg   rh   ri   Zdefault_limits)PandasAutoDateLocatorPandasAutoDateFormatterr&   r'   r@   rk   )rK   rc   r   rg   rh   ZdateminZdatemaxr-   r-   r.   rl   N  s   
zDatetimeConverter.axisinfoN)rK   r   r1   r   )rn   ro   rp   rq   re   r   rl   r-   r-   r-   r.   r$      s    

#r$   c                   @  s   e Zd Zd	d
ddZdS )r   N%Y-%m-%d
defaultfmtrX   r1   r?   c                 C  s   t j| ||| d S r#   )r   AutoDateFormatterrt   )rs   locatorr   r   r-   r-   r.   rt   c  s   z PandasAutoDateFormatter.__init__)Nr   )r   rX   r1   r?   )rn   ro   rp   rt   r-   r-   r-   r.   r   b  s    r   c                   @  s   e Zd Zdd Zdd ZdS )r   c                 C  sn   ||   }t|| jk r/d| _t| j}|| j |jj| j	   |jj
| j   |S tj| ||S )z*Pick the best locator based on a distance.)Ztotal_secondsabsZminticks_freqMilliSecondLocatorr   Zset_axisrc   Zset_view_intervalget_view_intervalZset_data_intervalget_data_intervalr   AutoDateLocatorget_locator)rs   dmindmaxrV   r   r-   r-   r.   r   h  s   
z!PandasAutoDateLocator.get_locatorc                 C  s   t | jS r#   )r   get_unit_genericr   rs   r-   r-   r.   	_get_unit}  s   zPandasAutoDateLocator._get_unitN)rn   ro   rp   r   r   r-   r-   r-   r.   r   g  s    r   c                   @  sF   e Zd ZdZdddZdd Zedd	 Zd
d Zdd Z	dd Z
dS )r   gLH>r1   r?   c                 C  s   t j| | d| _d S )Ng      ?)r   DateLocatorrt   	_interval)rs   r   r-   r-   r.   rt     s   
zMilliSecondLocator.__init__c                 C  s
   |  dS )Nr   )r   r   r-   r-   r.   r     ru   zMilliSecondLocator._get_unitc                 C  s   t j| }|dk rtjS |S )Nr   )r   ZRRuleLocatorr   r   UNIT)r   rK   r-   r-   r.   r     s   z#MilliSecondLocator.get_unit_genericc              
   C  sb  z|   \}}W n ty   g  Y S w t||f\}}|| d d }d}dD ]}|||d  kr8|| _ nd| _q)|| |  |    }|| jd kretd|d	d
| d| d| jd d	d	|  }| d}	| j	
d }
|jd d}|jd d}t|||	|
dt}zt|dkr| t|}|W S W n	 ty   Y nw t||g}|S )NiQ rx      )r   
   2   d      i  r   g     @@   z)MillisecondLocator estimated to generate rY   z ticks from z to z: exceeds Locator.MAXTICKS* 2 (z) r   )r   )startendr   r   r   )Zviewlim_to_dtr   r   r   r   r   _get_intervalZMAXTICKSRuntimeErrorr   tznamereplacer   ZastypeobjectlenZraise_if_exceedsr   )rs   r   r   ZnmaxZnminZnumZmax_millis_ticksintervalZestimater   r   stZedZ	all_datesrr   Zlimsr-   r-   r.   r     sT   

zMilliSecondLocator.__call__c                 C  s   | j S r#   )r   r   r-   r-   r.   r     s   z MilliSecondLocator._get_intervalc                 C  s,   |   \}}t|}t|}| ||S )z@
        Set the view limits to include the data range.
        )Zdatalim_to_dtr   r   r   )rs   r   r   vminvmaxr-   r-   r.   	autoscale  s   

zMilliSecondLocator.autoscaleNr   )rn   ro   rp   r   rt   r   rq   r   r   r   r   r-   r-   r-   r.   r     s    

-r   r   r   r   c           	      C  s   t | }t|}t| | }td| d\}}td| d\}}td| d\}}t d| }|dk r6d}t|j|j|jt |t |t ||}|d urR||}|dkr_|t	d| d7 }|S )	Nry   r   rP   rQ   r   r   i6B )Zmicroseconds)
r}   r   ZfromordinalrO   r   yearmonthdayZ
astimezoner   )	r]   r   ZixZdtZ	remainderrR   rS   rT   rU   r-   r-   r.   _from_ordinal  s"   
 
r   tuple[int, int]c                 C  s   | dk rd\}}||fS | dk rd\}}||fS | dk r$d\}}||fS | dk r0d\}}||fS | d	k r<d
\}}||fS | dk rHd\}}||fS | d d }|d |d }}||fS )zN
    Returns a default spacing between consecutive ticks for annual data.
       )r   r      )r   r   r   )r      r   )r   r   r   )r      iX  )r   r   rx   r   r-   )nyearsZmin_spacingZmaj_spacingZfactorr-   r-   r.   _get_default_annual_spacing  s*   
r   datesr   r   rX   npt.NDArray[np.intp]c                 C  s   t | |}t|d S )z
    Returns the indices where the given period changes.

    Parameters
    ----------
    dates : PeriodIndex
        Array of intervals to monitor.
    period : str
        Name of the period to monitor.
    r   )_period_break_maskr*   nonzero)r   r   maskr-   r-   r.   _period_break  s   
r   npt.NDArray[np.bool_]c                 C  s&   t | |}t | d| j  |}||kS )Nr   )getattrr   )r   r   ZcurrentrF   r-   r-   r.   r     s   
r   label_flagsr   boolc                 C  s4   | j dks| j dkr| d dkr|d dkrdS dS )z
    Returns true if the ``label_flags`` indicate there is at least one label
    for this level.

    if the minimum view limit is not an exact integer, then the first tick
    label won't be shown, so we must adjust for that.
    r   r           FTr   )r   r   r-   r-   r.   has_level_label  s   
"r   r   r"   tuple[int, int, int]c                 C  s   | j }t|}d}|tjjkrt| j}d| }d| }nC|tjkr(d}d}n9|tjkr2d}d}n/|tj	kr<d}d}n%|tj
krFd}d	}n|tjkrPd}d
}n|tjkrZd}d}ntd| |||fS )Nr      im     i     4   r         Unsupported frequency: )_period_dtype_coder   from_period_dtype_codeFR_HRr>   r   Z_cresoFR_BUSZFR_DAYFR_WKFR_MTHFR_QTRFR_ANNNotImplementedError)r   
dtype_codeZ
freq_groupZppdZppmZppyr-   r-   r.   _get_periods_per_ymd'  s6   









r  r   
np.ndarrayc              	     s  |j }t|\}}}| t| t|} }||  d }t ' tjddtd tjddtd tt| |dt||d|d W d    n1 sIw   Y  t	j
|dt	jfd	tfd
tfdgd} j|d d d < d|d d d < d|d	 ddg< |d	 |d
 |d fdd||krt dt d}	t ddF fdd}
dG fdd }dG fd!d"}||d# k r|d |S ||d$ k r|d% |S ||d& k r|d' |S ||d( k r|d) |S ||d* k r|d+ |S ||d, k r|d- |S ||d. k r|d |S ||d/ k r)|d% |S ||d0 k r6|d' |S ||d1 k rC|d+ |S ||d2 k rP|d- |S ||d3 k r^|
dd4 |S ||d5 k rl|
d%d4 |S ||d6 k rz|
d7d4 |S ||d3 k r|
d2d |S ||d8 k r|
d1d |S d|	< d< d9< d:|	< d;< tst|	sd;< |S d;|	< |S ||d8 krt d}	d|	< |tjjk rd|d
< nt dd|d
 < t d<}t dd9|< d=|	< d>< tst|	sd>|< |S d>|	< |S |d?| kr[t dt d}	t d<}d|	< d|< d4< d4|	< d@|	< dA< tsYdA|	< |S |d3| krt dt dB}t d}	d|< d|	< d@|< dA< |S |d8| krt dt d}	d< d|	< d4<  |	 j}|	|dk|dCkB  }d@|< dA< |S |dD| krt dt dB}d< d|< d4< dE< |S t d  j}|| }t|\}}|| dk }d|< || dk }d|< dE|< |S )HNr   r   r   r   r   r   r   )r   r   r   valmajmin)r   z|S20Zdtyper   r   Tr   r   c                   s2   | d dkr| j dkr d dkr| d S | d S )Nr   r   r   r   )r   )	vmin_origr-   r.   first_labelp  s   "z"_daily_finder.<locals>.first_labelr   r   r   label_intervalr}   force_year_startr   r1   r?   c                   sv    j }t d}d< d|||  dk@ < d|||  dk@ < d< d< |r7ts9d< d S d S d S )NrR   Tr   r|   %H:%M
%d-%b%H:%M
%d-%b
%Y)rR   r   r   )r  r  targetr   dates_	day_startr  info_fmtinfo_majinfo_minr  
year_startr-   r.   _hour_finder|  s   
z#_daily_finder.<locals>._hour_finderc                   ^    j }t d}t d}d|< d|||  dk@ < d|||  dk@ < d< d< d S )NrR   rS   Tr   r|   r  r  )rS   r   r   )r  r  Z
hour_startr   r  r  r  r  r  r   r-   r.   _minute_finder     

z%_daily_finder.<locals>._minute_finderc                   r"  )NrS   rT   Tr   r{   z%H:%M:%S
%d-%bz%H:%M:%S
%d-%b
%Y)rT   r   r   )r  r  Zminute_startr   r#  r-   r.   _second_finder  r%  z%_daily_finder.<locals>._second_finderi.  ip  r   i`	  r   i  r   i      i        F   ry   r   r         @Fg      ?g      ?r   r   z%dz%d
%bz%d
%b
%YZweekz

%bz

%b
%Yffffff?%b%b
%Yquarter   r   %Y)r  r}   r  r   r1   r?   )r  r}   r1   r?   )r  r  r}   r   r   r   r   r   r   r*   zerosZint64r   r   r   r   r   r  r>   r   r   r   )r   r   r   r  ZperiodsperdayZperiodspermonthperiodsperyearspaninfoZmonth_startr!  r$  r&  Z
week_startquarter_startZmonth_break
jan_or_julZ
year_breakr   
min_anndef
maj_anndef	major_idx	minor_idxr-   r  r.   _daily_finderK  sF  








trpnljhfdb`
^
\
Z
X
VMK




97


*


!






r<  c                 C  s$  t |\}}}| }t| t|} }||  d }tj|dtfdtfdtfdgd}t| |d |d< |d }d|d< |d	 d
k d
 }	|d }
|d }|d| krzd|
|	< d|d< d|d d < d||	< t|	|sx|jdkrrd}nd
}d||< |S |d| kr|d d
k }d|
|	< d|d |< d|d< d||< d||	< |S |d| krd|
|	< d|d< |d	 d
k|d	 dkB }d||< d||	< |S |d| kr|d d
k }d|
|	< d|d |< d||	< |S || }t	|\}}||	 d	 d }|	|| d
k }d|
|< d|d |	|| d
k < d||< |S )Nr   r  r  r  r   z|S8r  r   r   r   r   r,  Tr-  r.  r+  r   r   r   r   r1  
r  r}   r*   r2  r   aranger   r   r   r   )r   r   r   r   r3  r  r4  r5  r  r   r  r  idxr6  r7  r   r8  r9  yearsr:  r-   r-   r.   _monthly_finder  sj   

&rB  c                 C  s|  t |\}}}| }t| t|} }||  d }tj|dtfdtfdtfdgd}t| |d |d< d|d< |d }|d }	|d }
|d	 d
k d
 }|d| krzd|	|< d|d< d|
d d < d|
|< t||sx|jdkrrd}nd
}d|
|< |S |d| krd|	|< d|d< d|
|< |S || d	 d }|| }t	|\}}||| d
k }d|	|< d|d ||| d
k < d|
|< |S )Nr   r  r  r  r=  r  r   r   r   r   g      @TzQ%qzQ%q
%Fr   z%Fi  r>  )r   r   r   r   r3  r  r4  r5  r  r  r  r   r@  rA  r   r8  r9  r:  r-   r-   r.   _quarterly_finder[  sJ   

rC  c           
      C  s   t | t |d } }||  d }tj|dt fdtfdtfdgd}t| |d |d< d|d< |d }t|\}}|| d	k}|| d	k}	d
|d |< d
|d |	< d|d |< |S )Nr   r  r  r  r=  r  r   r   r   Tr1  )r}   r*   r2  r   r?  r   )
r   r   r   r4  r5  r  r8  r9  r:  r;  r-   r-   r.   _annual_finder  s   rD  c                 C  sb   | j }t|}|tjkrtS |tjkrtS |tjkrtS |tj	j
ks(|tjkr*tS td| )Nr  )r  r   r  r	  rD  r  rC  r  rB  r  r>   r  r<  r
  )r   r  Zfgroupr-   r-   r.   
get_finder  s   



rE  c                   @  sL   e Zd ZU dZded< 							ddddZdd Zdd Zdd ZdS )TimeSeries_DateLocatora  
    Locates the ticks along an axis controlled by a :class:`Series`.

    Parameters
    ----------
    freq : BaseOffset
        Valid frequency specifier.
    minor_locator : {False, True}, optional
        Whether the locator is for minor ticks (True) or not.
    dynamic_mode : {True, False}, optional
        Whether the locator should work in dynamic mode.
    base : {int}, optional
    quarter : {int}, optional
    month : {int}, optional
    day : {int}, optional
    r!   rc   FTr   Nr   r"   minor_locatorr   dynamic_modebaser}   r/  r   r   r1   r?   c	           	      C  sT   t |dd}|| _|| _|||| _| _| _|| _|| _d| _|| _	t
|| _d S NT)Z	is_periodr   )r   r   rI  r/  r   r   isminor	isdynamicoffsetplot_objrE  finder)	rs   r   rG  rH  rI  r/  r   r   rN  r-   r-   r.   rt     s   zTimeSeries_DateLocator.__init__c                 C  s>   |  ||| j}| jrt|d |d S t|d |d S )z'Returns the default locations of ticks.r  r  r  )rO  r   rK  r*   compress)rs   r   r   r   r-   r-   r.   _get_default_locs  s   z(TimeSeries_DateLocator._get_default_locsc                 C  sv   t | j }|\}}||k r||}}| jr| ||}|S | j}t||\}}|d | }tt||d |}|S )z"Return the locations of the ticks.r   )	ra   rc   r   rL  rQ  rI  r   r`   range)rs   vir   r   rr   rI  rY   r   r-   r-   r.   r     s   
zTimeSeries_DateLocator.__call__c                 C  sL   | j  \}}| ||}|ddg \}}||kr!|d8 }|d7 }t||S )zf
        Sets the view limits to the nearest multiples of base that contain the
        data.
        r   r   r   )rc   r   rQ  r   )rs   r   r   rr   r-   r-   r.   r     s   
z TimeSeries_DateLocator.autoscale)FTr   r   r   r   N)r   r"   rG  r   rH  r   rI  r}   r/  r}   r   r}   r   r}   r1   r?   )	rn   ro   rp   __doc____annotations__rt   rQ  r   r   r-   r-   r-   r.   rF    s   
 rF  c                   @  sJ   e Zd ZU dZded< 			ddddZdd ZdddZddddZdS )TimeSeries_DateFormattera  
    Formats the ticks along an axis controlled by a :class:`PeriodIndex`.

    Parameters
    ----------
    freq : BaseOffset
        Valid frequency specifier.
    minor_locator : bool, default False
        Whether the current formatter should apply to minor ticks (True) or
        major ticks (False).
    dynamic_mode : bool, default True
        Whether the formatter works in dynamic mode or not.
    r!   rc   FTNr   r"   rG  r   rH  r1   r?   c                 C  sJ   t |dd}d | _|| _g | _d | _|| _|| _d| _|| _t	|| _
d S rJ  )r   formatr   rr   
formatdictrK  rL  rM  rN  rE  rO  )rs   r   rG  rH  rN  r-   r-   r.   rt     s   z!TimeSeries_DateFormatter.__init__c                 C  s\   |  ||| j}| jrt|d t|d @ |}nt|d |}dd |D | _| jS )z"Returns the default ticks spacing.r  r  c                 S  s   i | ]	\}}}}||qS r-   r-   )r\   r]   r   fr-   r-   r.   
<dictcomp>7  r   z@TimeSeries_DateFormatter._set_default_format.<locals>.<dictcomp>)rO  r   rK  r*   rP  Zlogical_notrX  )rs   r   r   r5  rW  r-   r-   r.   _set_default_format/  s    z,TimeSeries_DateFormatter._set_default_formatc                 C  s:   || _ t| j \}}||k r||}}| || dS )zSets the locations of the ticksN)rr   ra   rc   r   r[  )rs   rr   r   r   r-   r-   r.   set_locs:  s
   
z!TimeSeries_DateFormatter.set_locsr   rv   rw   rX   c                 C  s   | j d u rdS | j |d}t|tjr|d}t  tjddt	d t
t|| jd}W d    n1 s9w   Y  t|t
sEJ ||S )Nr   zutf-8r   r   r   r  )rX  rI   rB   r*   Zbytes_decoder   r   r   r   r   r}   r   r   )rs   r]   rv   r   r   r-   r-   r.   r   F  s   



z!TimeSeries_DateFormatter.__call__)FTN)r   r"   rG  r   rH  r   r1   r?   r   r   r   )	rn   ro   rp   rT  rU  rt   r[  r\  r   r-   r-   r-   r.   rV    s   
 
rV  c                   @  s4   e Zd ZU dZded< eddd	ZddddZdS )TimeSeries_TimedeltaFormatterzR
    Formats the ticks along an axis controlled by a :class:`TimedeltaIndex`.
    r!   rc   
n_decimalsr}   r1   rX   c           	      C  s   t | d\}}t |d\}}t |d\}}t |d\}}t|d|d   }t|ddt|ddt|d}|dkrI|d	|d
| d7 }|dkrWt|dd| }|S )z8
        Convert seconds to 'D days HH:MM:SS.F'
        i ʚ;rP   ry   r   	   Z02d:r   .0rY   z days )r   r}   )	r]   rv   r_  r   nsr   r   rY   Zdecimalsr-   r-   r.   format_timedelta_ticks_  s   &z4TimeSeries_TimedeltaFormatter.format_timedelta_ticksr   rv   rw   c              
   C  sF   t | j \}}ttttdt||  d}| 	|||S )Nl    h] r`  )
ra   rc   r   r  r}   r*   ZceilZlog10r   re  )rs   r]   rv   r   r   r_  r-   r-   r.   r   p  s   &z&TimeSeries_TimedeltaFormatter.__call__N)r_  r}   r1   rX   r   r   )rn   ro   rp   rT  rU  rq   re  r   r-   r-   r-   r.   r^  X  s   
 r^  )r0   r   r1   r   )r1   r:   r   )rM   rN   r1   rO   r#   )r   r   r1   r   )r1   r   )r   r   r   rX   r1   r   )r   r   r   rX   r1   r   )r   r   r   rO   r1   r   )r   r"   r1   r   )r   rO   r   rO   r   r"   r1   r  )r   r"   )hZ
__future__r   
contextlibr   r&   r   r   r7   typingr   r   r   r   Zmatplotlib.datesr   r   Zmatplotlib.tickerr	   r
   r   Zmatplotlib.transformsr   Zmatplotlib.unitsr   r@   Znumpyr*   Zpandas._libsr   Zpandas._libs.tslibsr   r   Zpandas._libs.tslibs.dtypesr   r   Zpandas._typingr   r   Zpandas.core.dtypes.commonr   r   r   r   r   Zpandasr   r   r   Zpandas.core.commoncorecommonr   Zpandas.core.indexes.datetimesr   Zpandas.core.indexes.periodr   r   r   Zpandas.core.tools.datetimesr   Z	datetimesZcollections.abcr    Zmatplotlib.axisr!   Zpandas._libs.tslibs.offsetsr"   rC   r/   r9   contextmanagerr2   r<   r=   rW   rZ   ZConversionInterfacer)   rj   ZDateConverterr%   r   r$   r   r   r   r   r   r   r   r   r   r   r   r  cacher<  rB  rC  rD  rE  rF  rV  r^  r-   r-   r-   r.   <module>   s|    



	+(BN




$ HG/
YL