3
���h0 � @ s� d dl mZ d dlZd dlmZmZmZmZmZm Z m
Z
d dlZd dl
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d d l'm(Z( d d
l)m*Z* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d d
l4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z; d dl<j=j>Z?d dl@mAZB d dlCmDZD d dlEj=jFZGd'eHd�dd�ZIG dd� de$eBjJeBjK�ZLdd� ZMd(e
eee# e(f ee
eHef eNeLd�dd�ZOdd� ZPd)dd�Zd*d!d"�ZQd+d#d$�ZRd%d&� ZSdS ),� )� timedeltaN)�Any�Callable�List�Optional�Sequence�Type�Union) �
BaseOffset�NaT�NaTType� Timedelta�delta_to_nanoseconds�dt64arr_to_periodarr�iNaT�period� to_offset)� FreqGroup)�isleapyear_arr)�Tick�
delta_to_tick)�DIFFERENT_FREQ�IncompatibleFrequency�Period�PeriodMixin�get_period_field_arr�period_asfreq_arr)�AnyArrayLike)�cache_readonly)�TD64NS_DTYPE�
ensure_object�is_datetime64_dtype�is_float_dtype�is_period_dtype�pandas_dtype)�PeriodDtype)�
ABCIndexClass�ABCPeriodIndex� ABCSeries�ABCTimedeltaArray)�isna�notna)�datetimelike)�ExtensionArray)�namec s � fdd�}� |_ ||_t|�S )Nc s | j j}t� | j|�}|S )N)�freq�_period_dtype_coder �asi8)�self�base�result)r. � �;/tmp/pip-build-5_djhm0z/pandas/pandas/core/arrays/period.py�f8 s z_field_accessor.<locals>.f)�__name__�__doc__�property)r. Z docstringr7 r5 )r. r6 �_field_accessor7 s r; c s e Zd ZU dZdZdZeZefZe Z
g Zee
dgZdddgZdd d
ddd
dddddddddgZee e ZdddgZdwdd�Zedxejd d�dd ��Zedyed eeee ef ee ed d!�d"d#��Zedzd d$�d%d&��Z ed{d d$�d'd(��Z!ed)d*� �Z"eee#f e$d+�d,d-�Z%e
ed+�d.d/�Z&d|ed0�d1d2�Z'e(ed$�d3d4��Z)e*e+d$�d5d6��Z,d}ejd$�d7d8�Z-d~d9d:�Z.e/dd;�Z0e/d d<�Z1e/d
d=�Z2e/dd>�Z3e/dd?�Z4e/d
d@�Z5e/ddA�Z6e6Z7e/ddB�Z8e8Z9e/dCdD� Z:Z;e/ddE�Z<e/d�Z=e/ddF�Z>e>Z?e*ejd$�dGdH��Z@e*dIdJ� �ZAe*dKdL� �ZBddNdO�ZCd�dPdQ�ZDe*dRdS� �ZEd�e
d dU�dVdW�ZFd�edX�dYdZ�ZGd�d\d]�ZHd�ed_�� fd`da�
ZIdbdc� ZJddde� ZKdfdg� ZLejeMeNeNgeNf d dh�didj�ZOe+dk�� fdldm�ZP� fdndo�ZQdpdq� ZRdrds� ZSd�dudv�ZT� ZUS )��PeriodArrayaT
Pandas ExtensionArray for storing Period data.
Users should use :func:`period_array` to create new instances.
Parameters
----------
values : Union[PeriodArray, Series[period], ndarray[int], PeriodIndex]
The data to store. These should be arrays that can be directly
converted to ordinals without inference or copy (PeriodArray,
ndarray[int64]), or a box around such an array (Series[period],
PeriodIndex).
freq : str or DateOffset
The `freq` to use for the array. Mostly applicable when `values`
is an ndarray of integers, when `freq` is required. When `values`
is a PeriodArray (or box around), it's checked that ``values.freq``
matches `freq`.
dtype : PeriodDtype, optional
A PeriodDtype instance from which to extract a `freq`. If both
`freq` and `dtype` are specified, then the frequencies must match.
copy : bool, default False
Whether to copy the ordinals before storing.
Attributes
----------
None
Methods
-------
None
See Also
--------
period_array : Create a new PeriodArray.
PeriodIndex : Immutable Index for period data.
Notes
-----
There are two components to a PeriodArray
- ordinals : integer ndarray
- freq : pd.tseries.offsets.Offset
The values are physically stored as a 1-D ndarray of integers. These are
called "ordinals" and represent some kind of offset from a base.
The `freq` indicates the span covered by each element of the array.
All elements in the PeriodArray have the same `freq`.
i� Zperiodarray�is_leap_year�
start_time�end_timer/ �year�month�day�hour�minute�second�
weekofyear�weekday�week� dayofweek� dayofyear�quarter�qyear�
days_in_month�daysinmonth�strftime�to_timestamp�asfreqNFc C s� t ||�}|d k rtj|�}t|t�rD|j}t|t| ��sTtd��nt|t�rT|j}t|t| ��r�|d k r~||j kr~t
||��|j|j }}tj
|d|d�}|| _|d kr�td��t|�| _d S )NzIncorrect dtype�int64)�dtype�copyz,freq is not specified and cannot be inferred)�validate_dtype_freqr �_maybe_convert_freq�
isinstancer( �_values�type� TypeErrorr' |