跳到主要内容

Pandas 时间序列之 Period

1. 前言

上一小节我们学习了 Pandas 时间序列的第一种类型,时间戳(Timestamp),表示的是一个特定的时间点,除此之外,时间序列还有一种时间时期 (Period)类型,它表示的是时间区间,比如数日、数月、数年等数据,这小节我们开始学习 Period 类型的创建和使用方法。

2. 时期 Period

2.1 Period 的创建方法

Pandas 库中提供了特定的函数用于创建 Period 时期数据。其中提供了丰富参数边便于灵活的配置:

pd.Period(value=None, freq=None, ordinal=None, year=None, month=None,quarter=None, day=None, hour=None, minute=None, second=None)

参数名说明
value要转换为时期的值
freq时期的移动频率
year、month、quarter、day、hour年、月、季、日、时

下面我们通过代码展示具体的创建方法:

# 导入 pandas 数据包
import pandas as pd
# 创建时期对象
period_res = pd.Period('2020-12', freq = 'D')
print(period_res)

# --- 输出结果 ---
2020-12-01
# 结果解析:这里可以看到,我们通过指定 “2020-12” 和 频率 "D" 表示 day 的缩写,输出的结果是 2020-12-01 的时期。对于频率的理解,我们可以理解为移动的单位,下面我们通过运算看一下,freq 的效果:
print(period_res+3)
# --- 输出结果 ---
2017-12-04

2.2 时期常用的属性和方法

Period 中提供了丰富的属性和方法供用户使用,方便了对时期数据的处理和分析,下面我们列举一些常用的属性和方法,并用代码进行应用演示。

  1. start_time 和 end_time 属性

这两个属性分别用于获取时期数据对象的开始时间和结束时间,返回的值是时间戳。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2017-12', freq = '2D')
print(period_res.start_time)
# --- 输出结果 ---
2017-12-01 00:00:00

print(period_res.end_time)
# --- 输出结果 ---
2017-12-02 23:59:59.999999999

  1. freq 和 freqstr 属性

该属性用于获取时期对象的频率,只不过 freqstr 属性获取的是缩写的字母。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2017-12', freq = '2D')
print(period_res.freq)
# --- 输出结果 ---
<2 \* Days>

print(period_res.freqstr)
# --- 输出结果 ---
2D

结果解析:这里要注意的是在我们的频率前面还有一个 数字 2,因为我们设置的是频率是 2D,表示两天为单位。

  1. year 、month 和 day 属性

这三个属性分别用于获取时期的哪一年,一年中的第几个月,一个月中的第几天。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2017-12', freq = '2D')
print(period_res.year)
print(period_res.month)
print(period_res.day)

# --- 输出结果 ---
2017 # 年
12 #月
1 #日

  1. weekofyear 和 dayofweek 属性

这两个属性分别用于获取时期是一年中的第几周,一周中的周几(0 表示周 1)。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2020-12-4', freq = '2D')
print(period_res.weekofyear)
print(period_res.dayofweek)

# --- 输出结果 ---
49 # 2020年的第49周
4 # 从0开始,4表示周五

  1. now () 方法

获取当前的时间,可以通过指定方法中的频率,获取当前时期对象。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2020-12-4', freq = '3D')
print(period_res.now(freq='D'))

# --- 输出结果 ---
2021-01-11

  1. asfreq () 方法

该方法用于时期频率的转换。

# 导入 pandas 数据包
import pandas as pd
period_res = pd.Period('2020-12', freq = 'M')
print(period_res)
print(period_res.asfreq('D'))

# --- 输出结果 ---
2020-12 # 年为频率的时期
2020-12-31 # 天为频率的时期,由大频率转为小频率时,默认是大频率时期的末尾数据进行转换,这里就是12月的最后一天转换为频率为 D 的数据,我们还可以通过 how='start' 来指定转换时的依据(默认 how='end'):
print(period_res.asfreq('D',how = 'start'))
# --- 输出结果 ---
2020-12-01

2.3 时期索引

Period 中的索引类型为 PeriodIndex,我们可以通过函数 period_range () 生成时期序列,作为其他数据集的索引。

# 导入 pandas 数据包
import pandas as pd
period_index_res = pd.period_range('2020-02-22', '2020-03-04', freq='2D')
print(period_index_res)
# --- 输出结果 ---
PeriodIndex(['2020-02-22', '2020-02-24', '2020-02-26', '2020-02-28',
'2020-03-01', '2020-03-03'],dtype='period[2D]', freq='2D')
# 结果解析:这里可以看到生成的 PeriodIndex 序列值,我们下面将用他作为索引生成生产 DataFrame 数据集。

value_dateDataFrame = [["aa","bb"],["aa","bb"],["aa","bb"],["aa","bb"],["aa","bb"],["aa","bb"]]
res = pd.DataFrame(value_dateDataFrame, index = period_index_res)
print(res)
# --- 输出结果 ---
0 1
2020-02-22 aa bb
2020-02-24 aa bb
2020-02-26 aa bb
2020-02-28 aa bb
2020-03-01 aa bb
2020-03-03 aa bb
# 结果解析:这里可看到 时期序列作为索引的数据结果,可以方便的通过年、月去获取数据。

3. 小结

本节课程我们主要学习了 Pandas 时间序列的 Period ,包括时期数据对象的创建,常用的属性和方法,以及时期索引在数据集中的具体应用。本节课程的重点如下:

  • Period 时期数据创建函数 Period () 的使用;
  • Period 时期对象常用属性和方法的应用;
  • Period 时期索引的应用。

图片描述