a
    k=icA                     @  sJ  U 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mZmZ d dl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 d dlZd dlmZ d d	lmZ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* d dl+m,Z,m-Z-m.Z. d dl/m0  m1Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m0  m:  m;Z: e	rbd dl<m=Z= dZ>de?d< dZ@de?d< dZAde?d< eAe@ ZBde?d< eBe> ZCde?d< deC ZDde?d< i ZEdd ZFddddd ZGejHd!d"d#d$ZId%d"d&d'ZJd%d"d(d)ZKd*d+d,d-d.ZLd/d0 ZMG d1d2 d2ejNZOG d3d4 d4eZPG d5d6 d6ejQZRd7d8 ZSG d9d: d:ejQZTG d;d< d<ejUZVG d=d> d>ejWZXG d?d@ d@ejYZZdedAdBdCdDdEZ[dFd"dGdHZ\dIdJdKdLdMdNZ]dKd+dOdPdQdRZ^dSdTdUdVZ_dWdX Z`dYdZ Zad[d\ ZbdSdTd]d^ZcG d_d` d`eZdG dadb dbeZeG dcdd ddeZfdS )f    )annotationsN)datetime	timedeltatzinfo)TYPE_CHECKINGAnyFinalIteratorcast)relativedelta)AutoLocator	FormatterLocator)nonsingular)lib)	Timestamp	to_offset)	FreqGroup)F)is_floatis_float_dtype
is_integeris_integer_dtypeis_nested_list_like)IndexSeries
get_option)
date_range)PeriodPeriodIndexperiod_range)
BaseOffsetg      8@r   HOURS_PER_DAY      N@MIN_PER_HOURSEC_PER_MINSEC_PER_HOURSEC_PER_DAY@B MUSEC_PER_DAYc                  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 r4   v/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/pandas/plotting/_matplotlib/converter.py	get_pairsL   s    r6   r   )funcreturnc                   s    t   fdd}tt|S )z/
    Decorator applying pandas_converters.
    c                    s8   t    | i |W  d    S 1 s*0    Y  d S r*   )pandas_converters)argskwargsr7   r4   r5   wrapper]   s    z6register_pandas_matplotlib_converters.<locals>.wrapper)	functoolswrapsr
   r   )r7   r=   r4   r<   r5   %register_pandas_matplotlib_convertersX   s    r@   zIterator[None]r8   c                  c  s@   t d} | rt  zdV  W | dkr<t  n| dkr:t  0 dS )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)valuer4   r4   r5   r9   e   s    	r9   Nonec                  C  sP   t  } | D ]@\}}|tjv r>ttj| |s>tj| }|t|< | tj|< q
d S r*   )r6   unitsregistry
isinstance
_mpl_units)r3   type_clspreviousr4   r4   r5   rC   {   s    
rC   c                  C  sb   t  D ](\} }ttj| |u rtj|  qt D ]$\}}t|tt	t
hvr8|tj|< q8d S r*   )r6   typerG   rH   getpoprJ   itemsr+   r,   r0   )rK   rL   unit	formatterr4   r4   r5   rD      s    rD   z	pydt.timefloat)tmr8   c                 C  s(   | j d | jd  | j | jd  }|S )Ni  <   r(   )hourminutesecondmicrosecond)rU   tot_secr4   r4   r5   _to_ordinalf   s    $r\   c                 C  sP   t | tr8t| }t |ts,td|  t| S t | tjrLt| S | S )NzCould not parse time )	rI   strtoolsto_datetimer   
ValueErrorr\   r/   r-   )dparsedr4   r4   r5   time2num   s    


rc   c                   @  s<   e Zd Zedd ZeddddZedddd	Zd
S )r0   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rbdd | D S | S )Nc                 S  s   g | ]}t |qS r4   )rc   .0xr4   r4   r5   
<listcomp>       z)TimeConverter.convert.<locals>.<listcomp>)r]   r-   r/   rI   r   r   rc   r   maplisttupler1   ndarray)rE   rR   axisvalid_typesr4   r4   r5   convert   s    


zTimeConverter.convertzunits.AxisInfo | NonerA   c                 C  s*   | dkrd S t  }t|}tj||ddS )Nr/   )majlocmajfmtlabel)r   TimeFormatterrG   AxisInfo)rR   rm   rp   rq   r4   r4   r5   axisinfo   s
    zTimeConverter.axisinfor]   c                 C  s   dS )Nr/   r4   )rf   rm   r4   r4   r5   default_units   s    zTimeConverter.default_unitsN)__name__
__module____qualname__staticmethodro   ru   rv   r4   r4   r4   r5   r0      s   

r0   c                   @  s,   e Zd ZddddZddddd	d
ZdS )rs   rF   rA   c                 C  s
   || _ d S r*   )locs)selfr{   r4   r4   r5   __init__   s    zTimeFormatter.__init__r   intr]   posr8   c                 C  s   d}t |}t|| d }|d }|d }t|d\}}t|d\}	}t|	d\}
}	|dkrtt|	||||S |dkrt|	||||dd S |dkrt|	||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.%fr(     rV      r   N%H:%M:%S%H:%M)r~   rounddivmodr-   r/   strftime)r|   rf   r   fmtsZmsusmsusmh_r4   r4   r5   __call__   s    zTimeFormatter.__call__N)r   )rw   rx   ry   r}   r   r4   r4   r4   r5   rs      s   rs   c                   @  s$   e Zd Zedd Zedd ZdS )r,   c                   s0   t | r fdd| D } nt|  } | S )Nc                   s   g | ]}t | qS r4   )r,   _convert_1dre   vrm   rG   r4   r5   rg      rh   z+PeriodConverter.convert.<locals>.<listcomp>)r   r,   r   )valuesrG   rm   r4   r   r5   ro      s    zPeriodConverter.convertc                   s   t  dstdttttjtjtj	f}t
| |sBt| sBt| rNt|  jS t
| trf|  jjS t
| tr|  fddS tj| dddkrt|  jdjS t
| tttjtfrʇ fd	d
| D S | S )Nfreqz/Axis must have `freq` set to convert to Periodsc                   s   t |  jS r*   get_datevaluer   )rf   rm   r4   r5   <lambda>   rh   z-PeriodConverter._convert_1d.<locals>.<lambda>F)Zskipnaperiodr   c                   s   g | ]}t | jqS r4   r   rd   r   r4   r5   rg     rh   z/PeriodConverter._convert_1d.<locals>.<listcomp>)hasattr	TypeErrorr]   r   r   r-   r.   r/   r1   r2   rI   r   r   r   r   r   asfreqasi8r   ri   r   Zinfer_dtyperj   rk   rl   )r   rG   rm   rn   r4   r   r5   r      s    


zPeriodConverter._convert_1dN)rw   rx   ry   rz   ro   r   r4   r4   r4   r5   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| sft| sft | t	jtfrj| jdkrj| S | d u rvd S td|  dd S )N   zUnrecognizable date '')rI   r   r   ordinalr]   r   r-   r.   r/   r1   r2   r   r   rl   r   sizer`   )r.   r   r4   r4   r5   r     s     
r   c                   @  s8   e Zd Zedd Zedd Zeddddd	Zd
S )r+   c                   s0   t | r fdd| D } nt|  } | S )Nc                   s   g | ]}t | qS r4   )r+   r   r   rm   rR   r4   r5   rg     rh   z-DatetimeConverter.convert.<locals>.<listcomp>)r   r+   r   )r   rR   rm   r4   r   r5   ro     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rP|| S t | tttjttfrt | trxt| } t | tr| j} t | tjst| } t| st| r| S zt| } W n ty   Y n0 t| } | S )Nc                 S  s.   zt t| W S  ty(   |  Y S 0 d S r*   )datesdate2numr^   r_   	Exception)r   r4   r4   r5   	try_parse$  s    z0DatetimeConverter._convert_1d.<locals>.try_parse)rI   r   r-   r.   r1   r2   r/   r   r   r   r   r]   rj   rk   rl   r   r   r   comZasarray_tuplesafer   r   r^   r_   r   )r   rR   rm   r   r4   r4   r5   r   "  s,    





zDatetimeConverter._convert_1dtzinfo | Nonezunits.AxisInfo)rR   r8   c                 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   )rp   rq   rr   Zdefault_limits)PandasAutoDateLocatorPandasAutoDateFormatterr-   r.   rG   rt   )rR   rm   r   rp   rq   ZdateminZdatemaxr4   r4   r5   ru   F  s    
zDatetimeConverter.axisinfoN)rw   rx   ry   rz   ro   r   ru   r4   r4   r4   r5   r+     s   

#r+   c                   @  s   e Zd ZddddddZdS )	r   N%Y-%m-%dr]   rF   )
defaultfmtr8   c                 C  s   t j| ||| d S r*   )r   AutoDateFormatterr}   )r|   locatorr   r   r4   r4   r5   r}   [  s    z PandasAutoDateFormatter.__init__)Nr   )rw   rx   ry   r}   r4   r4   r4   r5   r   Z  s   r   c                   @  s   e Zd Zdd Zdd ZdS )r   c                 C  s   t ||}|jd |j d |j }|jd |j d |j }|d | }t|| jk rd| _	t
| j}|| j |jj| j   |jj| j   |S tj| ||S )z*Pick the best locator based on a distance.g      (@g      ?@r#   g     @)r   yearsmonthsdayshoursminutessecondsabsZminticks_freqMilliSecondLocatorr   Zset_axisrm   Zset_view_intervalget_view_intervalZset_data_intervalget_data_intervalr   AutoDateLocatorget_locator)r|   dmindmaxdeltaZnum_daysZnum_secr[   r   r4   r4   r5   r   `  s    

z!PandasAutoDateLocator.get_locatorc                 C  s   t | jS r*   )r   get_unit_genericr   r|   r4   r4   r5   	_get_units  s    zPandasAutoDateLocator._get_unitN)rw   rx   ry   r   r   r4   r4   r4   r5   r   _  s   r   c                   @  sJ   e Zd ZdZd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>rF   rA   c                 C  s   t j| | d| _d S )Ng      ?)r   DateLocatorr}   	_interval)r|   r   r4   r4   r5   r}   {  s    zMilliSecondLocator.__init__c                 C  s
   |  dS )Nr   )r   r   r4   r4   r5   r     s    zMilliSecondLocator._get_unitc                 C  s   t j| }|dk rtjS |S Nr   )r   ZRRuleLocatorr   r   UNIT)r   rR   r4   r4   r5   r     s    z#MilliSecondLocator.get_unit_genericc              
   C  sh  z|   \}}W n ty&   g  Y S 0 t||f\}}|| d d }d}dD ]&}|||d  krr|| _ qzqRd| _qR|| |  |    }|| jd krt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yT   Y n0 t||g}|S )NQ r      )r   
   2   d      i  r   g     @@   z)MillisecondLocator estimated to generate ra   z ticks from z to z: exceeds Locator.MAXTICKS* 2 (z) L)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   )r|   r   r   ZnmaxZnminnumZmax_millis_ticksintervalestimater   r   stedZ	all_datesr{   Zlimsr4   r4   r5   r     sN    



zMilliSecondLocator.__call__c                 C  s   | j S r*   )r   r   r4   r4   r5   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   )r|   r   r   vminvmaxr4   r4   r5   	autoscale  s    

zMilliSecondLocator.autoscaleN)rw   rx   ry   r   r}   r   rz   r   r   r   r   r4   r4   r4   r5   r   w  s   
.r   r   r   )r   r8   c           	      C  s   t | }t|}t| | }td| d\}}td| d\}}td| d\}}t d| }|dk rld}t|j|j|jt |t |t ||}|d ur||}|dkr|t	d| d7 }|S )	Nr   r   rV   r(   r   r   i6B )microseconds)
r~   r   fromordinalrT   r   yearmonthday
astimezoner   )	rf   r   Zixdt	remainderrW   rX   rY   rZ   r4   r4   r5   _from_ordinal  s"    
 
r   ztuple[int, int]c                 C  s   | dk rd\}}nx| dk r$d\}}nf| dk r6d\}}nT| dk rHd\}}nB| d	k rZd
\}}n0| dk rld\}}n| 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   r   r   r4   )nyearsZmin_spacingZmaj_spacingfactorr4   r4   r5   _get_default_annual_spacing  s    





r   r   r]   z
np.ndarray)r   r   r8   c                 C  s0   t | |}t | d| j  |}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   r   )getattrr   r1   nonzero)r   r   currentrM   r4   r4   r5   period_break  s    
r   bool)label_flagsr   r8   c                 C  s8   | j dks,| j dkr0| d dkr0|d dkr0dS 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           FTNr   )r   r   r4   r4   r5   has_level_label
  s    


r   r!   r   c                   s  |j }t|}d}|tjjkr|tjkr0d}n^|tjkr@d}nN|tjkrPd}n>|tjkr`d}n.|tj	krpd}n|tjkrd}nt
d| d	| }d
| }nD|tjkrd}d}n0|tjkrd	}d
}n|tjkrd}d}nt
d| tt| |dtt||d } }t| tsJ t|ts*J |j| j d }t| ||d 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r*t dt d}	 fd d!}
 fd"d#} fd$d%}||d& k r6|d q||d' k rP|d( q||d) k rj|d* q||d+ k r|d, q||d- k r|d. q||d/ k r|d0 q||d1 k r|d q||d2 k r|d( q||d k r|d* q||d3 k r |d. q||d4 k r8|d0 n||d5 k rR|
dd6 n||d7 k rl|
d(d6 n||d8 k r|
dd6 n||d5 k r|
d4d n||d9 k r|
d3d nld|	< d< t d:}d d;< d<|	< d=|< t|st|	sd=< nd=|	< n||d9 krt d}	d|	< |tjjk rbdd< nt ddd < t d>}t d:}d;|< d?|	< d@|< t|st|	sd@|< nd@|	< n|dA| krRt d:}t d}	t d>}d|	< d|< d6|< d6|	< dB|	< dC|< t|sdC|	< n^|d5| krt d:}t dD}t d}	d|< d|	< dB|< dC|< n|d9| krt d:}t d}	d|< d|	< d6|<  |	 j}|	|dk|dEkB  }dB|< dC|< n|dF| krPt d:}t dD}d|< d|< d6|< dG|< n`t d:} | j}|| }t|\}}||| dk }d|< ||| dk }d|< dG|< S )HNr   l     "R: l    `;P i \&r   i  r   zunexpected frequency: im     i     4      zunexpected frequencyr   r   r   )r   r   r   valmajmin)r   z|S20Zdtyper   r   Tr   c                   s6   | d dkr*| j dkr* d dkr*| d S | d S d S )Nr   r   r   r   )r   )	vmin_origr4   r5   first_labelV  s    "z"_daily_finder.<locals>.first_labelr   r   c                   s    j } d j  j }|| dk}d< d|||  dk@ < t d}d|||  dk@ < d< d|< |rt|sd< d S )Nr   r   Tr   r   %H:%M
%d-%b%H:%M
%d-%b
%Y)rW   r   r   r   )label_intervalZforce_year_startZ_hourZ
_prev_hour
hour_start
year_start)dates_	day_startr  info_fmtinfo_majinfo_minr  r4   r5   _hour_findera  s    
z#_daily_finder.<locals>._hour_finderc                   s   t  d} j} d j  j}|| dk}d|< d|||  dk@ < t  d}d }d||||  dk@ < d|< d	||< d S )
NrW   r   r   Tr   r   r   r  r	  )r   rX   r   )r
  r  Z_minuteZ_prev_minuteminute_startr  r  )r  r  infor  r  r4   r5   _minute_findern  s    

z%_daily_finder.<locals>._minute_finderc                   s   t  d} j} d j  j}|| dk}dd |< dd |||  dk@ < t  d}d }d	||||  dk@ < d
|< d||< d S )NrX   r   r   Tr  r  r   r   r   z%H:%M:%S
%d-%bz%H:%M:%S
%d-%b
%Y)r   rY   r   )r
  r  Z_secondZ_prev_secondZsecond_startr  r  )r  r  r  r4   r5   _second_finder{  s    

z%_daily_finder.<locals>._second_finderi.  ip  r   i`	  r   i  r   i      i        F      r         @Fg      ?g      ?   r   z%dz%d
%bz%d
%b
%Yweekz

%bz

%b
%Yffffff?%b%b
%Yquarter   r   %Y)_period_dtype_coder   from_period_dtype_codeZFR_HRrE   ZFR_NSZFR_USZFR_MSZFR_SECZFR_MINr`   FR_BUSZFR_DAYFR_WKr   r~   rI   r   r    r1   zerosint64r   r   r   r   r   r   r   )r   r   r   
dtype_codeZ
freq_groupZperiodsperdayperiodsperyearZperiodspermonthspanZmonth_startr  r  r  r  Z
week_startquarter_startZmonth_break
jan_or_julZ
year_breakr   
min_anndef
maj_anndef	major_idxZ	minor_idxr4   )r  r  r  r  r  r  r  r  r5   _daily_finder  s>   



































r3  c                 C  s  d}| }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rd|	|< d|d< d|
d d < d|
|< t||s|jdkrd}nd
}d|
|< n,|d| kr6|d d
k }d|	|< d|d	 |< d|d< d|
|< d|
|< n|d| kr~d|	|< d|d< |d d
k|d dkB }d|
|< d|
|< n|d| kr|d d
k }d|	|< d|d |< d|
|< n\|| }t|\}}|| d d }||| d
k }d|	|< d|d ||| d
k < d|
|< |S )Nr  r   r  r  r  r   z|S8r  r   r   r   r  Tr   r!  r  r   r  r   r   r$  	r~   r1   r)  r   aranger   r   r   r   )r   r   r   r,  r  r-  r  r  r  r  r  idxr.  r/  r   r0  r1  r   r2  r4   r4   r5   _monthly_finder  sb    




r8  c                 C  sp  d}| }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rd||
< d|d< d|	d d < d|	|
< t|
|s|jdkrd}nd
}d|	|< n|d| krd||
< d|d< d|	|
< n\||
 d d }|| }t|\}}|
|| d
k }d||< d|d |
|| d
k < d|	|< |S )Nr  r   r  r  r  r4  r  r   r   r   g      @TzQ%qzQ%q
%Fr   z%Fi  r5  )r   r   r   r,  r  r-  r  r  r  r  r  r7  r   r   r0  r1  r2  r4   r4   r5   _quarterly_finderH  sF    



r9  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
|d |< d
|d || d	k< d|d |< |S )Nr   r  r  r  r4  r  r   r   r   Tr$  )r~   r1   r)  r   r6  r   )	r   r   r   r-  r  r  r0  r1  r2  r4   r4   r5   _annual_finderw  s    r:  c                 C  sf   | j }t|}|tjkrtS |tjkr,tS |tjkr:tS |tj	j
ksP|tjkrTtS td| d S )NzUnsupported frequency: )r%  r   r&  ZFR_ANNr:  ZFR_QTRr9  ZFR_MTHr8  r'  rE   r(  r3  NotImplementedError)r   r+  Zfgroupr4   r4   r5   
get_finder  s    



r<  c                
   @  sF   e Zd ZdZddddddd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
    FTr   Nr!   r   r~   rF   )r   minor_locatordynamic_modebaser"  r   r   r8   c	           	      C  sP   t |}|| _|| _|||  | _| _| _|| _|| _d| _|| _	t
|| _d S r   )r   r   r@  r"  r   r   isminor	isdynamicoffsetplot_objr<  finder)	r|   r   r>  r?  r@  r"  r   r   rD  r4   r4   r5   r}     s    zTimeSeries_DateLocator.__init__c                 C  sV   | j jdu r | ||| j| j _| j j}| jrBt|d |d S t|d |d S )z'Returns the default locations of ticks.Nr  r  r  )rD  date_axis_inforE  r   rA  r1   compress)r|   r   r   r   r4   r4   r5   _get_default_locs  s    z(TimeSeries_DateLocator._get_default_locsc                 C  s   t | j }|| jjkr"d| j_|| j_|\}}||k rD|| }}| jrX| ||}n4| j}t	||\}}|d | }t
t||d |}|S )z"Return the locations of the ticks.Nr   )rk   rm   r   rD  view_intervalrF  rB  rH  r@  r   rj   range)r|   vir   r   r{   r@  ra   r   r4   r4   r5   r     s    
zTimeSeries_DateLocator.__call__c                 C  sL   | j  \}}| ||}|ddg \}}||krB|d8 }|d7 }t||S )zf
        Sets the view limits to the nearest multiples of base that contain the
        data.
        r   r   r   )rm   r   rH  r   )r|   r   r   r{   r4   r4   r5   r     s    z TimeSeries_DateLocator.autoscale)FTr   r   r   r   N)rw   rx   ry   __doc__r}   rH  r   r   r4   r4   r4   r5   r=    s          r=  c                   @  sN   e Zd ZdZddddddd	d
Zdd ZddddZdd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.
    FTNr!   r   rF   )r   r>  r?  r8   c                 C  sF   t |}d | _|| _g | _d | _|| _|| _d| _|| _t	|| _
d S r   )r   formatr   r{   
formatdictrA  rB  rC  rD  r<  rE  )r|   r   r>  r?  rD  r4   r4   r5   r}     s    z!TimeSeries_DateFormatter.__init__c                 C  st   | j jdu r | ||| j| j _| j j}| jrNt|d t|d @ |}nt|d |}dd |D | _| jS )z"Returns the default ticks spacing.Nr  r  c                 S  s   i | ]\}}}}||qS r4   r4   )re   rf   r   fr4   r4   r5   
<dictcomp>"  rh   z@TimeSeries_DateFormatter._set_default_format.<locals>.<dictcomp>)	rD  rF  rE  r   rA  r1   rG  Zlogical_notrO  )r|   r   r   r  rN  r4   r4   r5   _set_default_format  s     z,TimeSeries_DateFormatter._set_default_formatrA   c                 C  sZ   || _ t| j  \}}}|| jjkr0d| j_|| j_||k rJ|| }}| || dS )zSets the locations of the ticksN)r{   rk   rm   r   rD  rI  rF  rR  )r|   r{   r   r   rK  r4   r4   r5   set_locs%  s    
z!TimeSeries_DateFormatter.set_locsr   r~   r]   r   c                 C  s`   | j d u rdS | j |d}t|tjr2|d}tt|| jd}t|tsRJ |	|S d S )Nr   zutf-8r  )
rO  rP   rI   r1   bytes_decoder   r~   r   r   )r|   rf   r   r   r   r4   r4   r5   r   4  s    

z!TimeSeries_DateFormatter.__call__)FTN)r   )rw   rx   ry   rL  r}   rR  rS  r   r4   r4   r4   r5   rM    s      rM  c                   @  s6   e Zd ZdZedddddZddddd	d
ZdS )TimeSeries_TimedeltaFormatterzR
    Formats the ticks along an axis controlled by a :class:`TimedeltaIndex`.
    r~   r]   )
n_decimalsr8   c           	      C  s   t | d\}}t |d\}}t |d\}}t |d\}}t|d|d   }t|ddt|ddt|d}|dkr|d	|d
| d7 }|dkrt|dd| }|S )z8
        Convert seconds to 'D days HH:MM:SS.F'
        i ʚ;rV   r   r   	   02d:r   .0ra   z days )r   r~   )	rf   r   rW  r   nsr   r   ra   Zdecimalsr4   r4   r5   format_timedelta_ticksF  s    &z4TimeSeries_TimedeltaFormatter.format_timedelta_ticksr   r   c              	   C  sL   t | j \}}tttdt||  }|dkr>d}| |||S )Nl    h] rX  )	rk   rm   r   r~   r1   ceillog10r   r^  )r|   rf   r   r   r   rW  r4   r4   r5   r   W  s
     z&TimeSeries_TimedeltaFormatter.__call__N)r   )rw   rx   ry   rL  rz   r^  r   r4   r4   r4   r5   rV  A  s   rV  )N)g
__future__r   
contextlibr   r-   r   r   r>   typingr   r   r   r	   r
   Zdateutil.relativedeltar   Zmatplotlib.datesr   Zmatplotlib.tickerr   r   r   Zmatplotlib.transformsr   Zmatplotlib.unitsrG   numpyr1   Zpandas._libsr   Zpandas._libs.tslibsr   r   Zpandas._libs.tslibs.dtypesr   Zpandas._typingr   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pandas._libs.tslibs.offsetsr!   r"   __annotations__r$   r%   r&   r'   r)   rJ   r6   r@   contextmanagerr9   rC   rD   r\   rc   ZConversionInterfacer0   rs   ZDateConverterr,   r   r+   r   r   r   r   r   r   r   r   r   r   r3  r8  r9  r:  r<  r=  rM  rV  r4   r4   r4   r5   <module>   sv   +BP iF/[J