# 5 Best Ways to Create a PeriodIndex and Set Frequency in Pandas

Rate this post

π‘ Problem Formulation: In data manipulation with Python, efficiently creating a time-based index and setting its frequency are common tasks when handling time series data. Users often start with a range of dates or periods and want to transform this into a PeriodIndex with a specific frequency. For instance, input could be a range of dates in YYY-MM-DD format, while the desired output is a PeriodIndex with monthly frequency.

## Method 1: Using `pd.period_range()`

One of the primary methods to create a PeriodIndex with a specific frequency is by using `pd.period_range()`. This function returns a fixed-frequency PeriodIndex, with day (D), month (M), year (Y), etc., being common frequencies.

Here’s an example:

```import pandas as pd

period_index = pd.period_range(start='2021-01', end='2021-12', freq='M')
print(period_index)```

Output:

```PeriodIndex(['2021-01', '2021-02', '2021-03', '2021-04', '2021-05', '2021-06',
'2021-07', '2021-08', '2021-09', '2021-10', '2021-11', '2021-12'],
dtype='period[M]', freq='M')```

This code snippet creates a `PeriodIndex` starting from January 2021 to December 2021 with a monthly frequency.

## Method 2: Using `pd.PeriodIndex()` Constructor

Another method to create a PeriodIndex is by using the `pd.PeriodIndex()` constructor. This is useful when starting from an array-like structure of period strings or timestamps.

Here’s an example:

```import pandas as pd

date_arr = ['2021-01', '2021-02', '2021-03']
period_index = pd.PeriodIndex(date_arr, freq='M')
print(period_index)```

Output:

`PeriodIndex(['2021-01', '2021-02', '2021-03'], dtype='period[M]', freq='M')`

In this code snippet, we create a `PeriodIndex` from an array of period strings, setting a monthly frequency directly in the constructor.

## Method 3: Converting DatetimeIndex to PeriodIndex

Existing `DatetimeIndex` objects can be converted to `PeriodIndex` using the `.to_period()` method, which allows setting a different frequency than the original.

Here’s an example:

```import pandas as pd

datetime_index = pd.date_range(start='2021-01-01', periods=3, freq='M')
period_index = datetime_index.to_period(freq='M')
print(period_index)```

Output:

`PeriodIndex(['2021-01', '2021-02', '2021-03'], dtype='period[M]', freq='M')`

This snippet converts a `DatetimeIndex` to a `PeriodIndex`, maintaining the monthly frequency.

## Method 4: Modifying the Frequency of an Existing PeriodIndex

If you already have a `PeriodIndex`, you can alter its frequency using the `.asfreq()` method. This helps in frequency conversion, such as converting from monthly to yearly frequency.

Here’s an example:

```import pandas as pd

monthly_period_index = pd.period_range(start='2021-01', periods=12, freq='M')
yearly_period_index = monthly_period_index.asfreq('A-DEC')
print(yearly_period_index)```

Output:

```PeriodIndex(['2021', '2021', '2021', '2021', '2021', '2021', '2021', '2021',
'2021', '2021', '2021', '2021'],
dtype='period[A-DEC]', freq='A-DEC')```

Here we convert a monthly `PeriodIndex` to an annual one, anchored at the end of December.

## Bonus One-Liner Method 5: Using List Comprehension with `pd.Period()`

A quick one-liner to create a PeriodIndex involves using a list comprehension with the `pd.Period()` constructor for each period string, followed by converting the list to a `PeriodIndex` object.

Here’s an example:

```import pandas as pd

period_list = [pd.Period('2021-01', freq='M')] * 12
period_index = pd.PeriodIndex(period_list)
print(period_index)```

Output:

```PeriodIndex(['2021-01', '2021-01', '2021-01', '2021-01', '2021-01', '2021-01',
'2021-01', '2021-01', '2021-01', '2021-01', '2021-01', '2021-01'],
dtype='period[M]', freq='M')```

This snippet demonstrates a concise way to initialize a `PeriodIndex` with identical periods using list comprehension.

## Summary/Discussion

• Method 1: Using `pd.period_range()`. Best for creating a PeriodIndex from scratch with a defined range. Offers simplicity and direct approach. Might not be flexible for irregular period data.
• Method 2: Using `pd.PeriodIndex()` Constructor. Best for creating a PeriodIndex from existing period data or arrays. Allows more custom input but can be verbose for large datasets.
• Method 3: Converting DatetimeIndex to PeriodIndex. Great for scenarios where a conversion from a DatetimeIndex is needed. Easy to implement but requires the initial existence of a DatetimeIndex.
• Method 4: Modifying the Frequency of an Existing PeriodIndex. Ideal for changing the frequency of an established PeriodIndex. Straightforward for frequency conversion, however, not suitable for creating new PeriodIndexes.
• Method 5: Using List Comprehension with `pd.Period()`. Quick and concise for creating PeriodIndexes with repetitive periods. However, it may not be the best for handling more complex or varied period data.