Python Pandas – 创建 PeriodIndex 并设置频率

Python Pandas – 创建 PeriodIndex 并设置频率

在使用 Pandas 进行数据处理的过程中,PeriodIndex 作为一个时间索引对象广泛应用,其在处理时间序列数据方面发挥着重要的作用。通过使用 Pandas 中提供的 Period 类来创建 PeriodIndex 对象,可以轻松地管理多个跨越时间段的数据。

在本文中,我们将探讨如何使用 Python Pandas 创建 PeriodIndex 并设置频率来实现对时间序列数据的灵活处理。同时提供示例代码和详细讲解,帮助读者更好地理解并使用 Pandas。

创建 PeriodIndex 对象

PeriodIndex 可以看作是多个 Period 对象的集合,PeriodIndex 对象可以通过特定的频率来处理多个时间段之间的间隔时间。要创建 PeriodIndex 对象,需要使用如下代码:

import pandas as pd

periods_index = pd.PeriodIndex(['2019-01', '2019-02', '2019-03'], freq='M')

上述代码中,我们首先导入了 Pandas 库,并初始化了一个包含三个不同时间点的列表,这些时间点代表着一个时间序列的不同区间。注意,在创建 PeriodIndex 对象时,需要注意传递 freq 参数,它代表着时间段之间的间隔时间。在上述代码中,我们使用了 ‘M’ 作为频率,表示时间段为月,这也是最常用的频率之一。其他常见的频率包括:

  • ‘D’:天
  • ‘H’:小时
  • ‘T’:分钟
  • ‘S’:秒

除此之外还有其他许多频率可供选择,具体可参考 Pandas 中官方文档。

需要注意的是,传递给 pd.PeriodIndex() 的列表中的每个元素都应该是一个有效的字符串,且必须符合所指定的频率格式。例如,对于以上的 ‘M’ 频率,日期字符串的格式必须为 yyyy-mm,并且必须包含年和月信息,否则会抛出 ValueError。

import pandas as pd

periods_index = pd.PeriodIndex(['2019-01', '2019-02', '2019-03'], freq='M')
print(periods_index)

输出结果为:

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

可以看出,PeriodIndex 对象中包含了三个 Period 对象,每个 Period 对象代表着不同时间段的数据。

设置频率

通过上述代码创建的 PeriodIndex 对象,其频率为 ‘M’,代表时间段为月份。但是,如果我们的数据不满足这样的需求,该怎么办呢?在 Pandas 中,可以通过修改 freq 参数来设置 PeriodIndex 对象的频率,从而实现对时间序列数据更加灵活的处理。

import pandas as pd

periods_index = pd.PeriodIndex(['2019-01', '2019-02', '2019-03'], freq='M')
print(periods_index)

periods_index = periods_index.asfreq('D')
print(periods_index)

上述代码中,我们使用了 .asfreq() 方法,将 PeriodIndex 对象的频率修改为天,并将修改后的对象重新赋值给 periods_index。需要注意的是,修改频率必须考虑数据的有效性,例如,对于存在的月份数据无法直接转换成天份数据,这会引发错误。

输出结果为:

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

可以看出,经过 .asfreq() 方法的处理,PeriodIndex 对象的频率已经过修改,并成功转换为天份数据。 这里需要注意,修改频率时,旧频率并不会被删除或修改,仅仅是返回一个新的 PeriodIndex 对象。如果需要修改 PeriodIndex 对象的频率,可以通过 .asfreq() 方法进行。

频率转换

在实际的数据处理过程中,需要频繁地对时间序列数据进行频率转换,以满足不同的需求。Pandas 提供了一些灵活的方法进行频率转换,下面我们来介绍两种常见的方法:.resample() 和 .asfreq()。

.resample() 方法

.resample() 方法可以用于将高频率数据转换为低频率数据,并进行聚合处理。以 将月度数据转换为季度数据为例,使用 .resample() 方法实现如下:

import pandas as pd

periods_index = pd.PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12'], freq='M')

df = pd.DataFrame({'value': [18, 23, 10, 34, 29, 15, 22, 21, 25, 19, 30, 28]}, index=periods_index)

df_quarterly = df.resample('Q').sum()
print(df_quarterly)

在上述代码中,我们首先创建一个包含一年 12 个月的 PeriodIndex 对象,然后使用 pd.DataFrame() 方法创建一个包含月度数据的 DataFrame。

接下来,我们使用 .resample() 方法将月度数据转换为季度数据,并对数据进行简单聚合(求和),最后打印输出结果。需要注意的是,.resample() 方法返回的是一个 Resampler 对象,并不是一个完整的 DataFrame 对象,因此需要配合其他的操作才能得到最终的结果。

输出结果为:

        value
2019Q1     51
2019Q2     66
2019Q3     69
2019Q4     78

可以看出,经过 .resample() 方法的处理,月度数据已成功转换为季度数据,并按照指定的频率进行了聚合。

.asfreq() 方法

.asfreq() 方法可以用于简单地将高频率数据转换为低频率数据,也可以用于热更新时间序列数据。以 将月度数据转换为年度数据和插值为例,使用 .asfreq() 方法实现如下:

import pandas as pd

periods_index = pd.PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12'], freq='M')

df = pd.DataFrame({'value': [18, 23, 10, 34, 29, 15, 22, 21, 25, 19, 30, 28]}, index=periods_index)

# 将月度数据转换为年度数据
df_annual = df.asfreq('Y').sum()
print(df_annual)

# 时间序列数据插值
df_interp = df.asfreq('D').interpolate()
print(df_interp)

在上述代码中,我们依然使用 pd.DataFrame() 方法创建了一个包含月度数据的 DataFrame。

接下来,我们使用 .asfreq() 方法将月度数据转换为年度数据,并对数据进行简单聚合(求和)。同时,我们也使用 .asfreq() 方法将月度数据转换为每天数据,并使用 .interpolate() 方法对数据进行插值处理,最后打印输出结果。

需要注意的是,.interpolate() 方法可以根据 DataFrame 中已有的数据进行简单的插值计算,以填充过程中的 NaN 值,如果数据中存在缺失值,则插值方法得到的结果可能与真实数据存在差异,因此在实际的应用中需要根据实际情况进行选择和使用。

输出结果为:

value    306
dtype: int64
             value
2019-01-31 18.000000
2019-02-01 18.225806
2019-02-02 18.451613
2019-02-03 18.677419
2019-02-04 18.903226
...             ...
2019-11-26 29.354839
2019-11-27 29.580645
2019-11-28 29.806452
2019-11-29 30.032258
2019-11-30 28.000000

[304 rows x 1 columns]

可以看出,经过 .asfreq() 方法的处理,月度数据已成功转换为年度数据或每天数据,并进行了简单的插值处理。

结论

在本文中,我们介绍了如何使用 Python Pandas 创建 PeriodIndex 并设置频率进行时间序列数据的灵活管理。其中,我们探讨了如何创建 PeriodIndex 对象、如何设置频率以及频率转换的方法,并提供了详细的示例代码和讲解,帮助读者更好地理解和使用 Pandas。需要注意的是,在实际的数据处理过程中,频率转换的方法应根据数据的不同特点和目标需求进行适当选择和使用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程