关键词

Pandas时间序列:时期(period)及其算术运算详解

Pandas时间序列:时期(period)及其算术运算详解

什么是时期(period)

在Pandas中,时期(period)指的是时间跨度,比如一年、一个月、一个季度等。时期的时间间隔是固定的,不像时间戳(Timestamp),是指特定时刻。

时期的创建

可以使用Pandas中的Period类来创建时期。其通用的语法如下:

p = pd.Period('2021-09', freq='M')

其中'2021-09'是时期开始的日期,freq参数表示这个时期的长度。在这个例子中,freq='M'表示这个时期的长度为一个月,也就是说,这个时期的时间跨度是'2021-09-01'到'2021-09-30'。

也可以使用period_range()函数创建一个时期范围(period range),它的语法如下:

pr = pd.period_range('2021-01', '2021-12', freq='M')

这里的pr是一个包含了从'2021-01'到'2021-12',长度为一个月的所有时期的PeriodIndex对象。

时期的算术运算

时期之间的算术运算和数字之间的算术运算是类似的。例如,可以对两个时期进行相减,得到它们之间的时间跨度:

p1 = pd.Period('2021-09', freq='M')
p2 = pd.Period('2022-01', freq='M')
p2 - p1  # 4

这里的结果4表示p2和p1之间相差了四个月。

时期也支持加上或减去一个整数来抵消时间跨度。例如,将一个时期加上或减去一个整数,会得到位于同一时间轴上的另一个时期:

p = pd.Period('2021-09', freq='M')
p + 1  # Period('2021-10', 'M')
p - 2  # Period('2021-07', 'M')

这里的结果'Period('2021-10', 'M')'表示从'2021-09-01'往后一个月,而结果'Period('2021-07', 'M')'表示往前两个月。

时期之间也支持比较运算,例如等于(==)、大于(>)、小于(<)等:

p1 = pd.Period('2021-09', freq='M')
p2 = pd.Period('2022-01', freq='M')
p1 < p2  # True

还可以通过period_range()函数创建一个时期范围(period range),然后进行算术运算:

pr1 = pd.period_range('2021-01', '2021-12', freq='M')
pr2 = pd.period_range('2022-01', '2022-12', freq='M')
pr2 - pr1

这里的结果是一个包含了12个值的PeriodIndex对象,分别表示两个时期范围之间相差的时间跨度。

时期的示例说明

示例1:时期的创建和算术运算

import pandas as pd

# 创建单个时期
p1 = pd.Period('2021-09', freq='M')
print(p1)  # Period('2021-09', 'M')

# 创建时期范围
pr = pd.period_range('2021-01', '2021-12', freq='M')
print(pr)

# 时期算术运算
p2 = pd.Period('2022-01', freq='M')
print(p2 - p1)  # 4
print(p2 < p1)  # False

运行结果:

Period('2021-09', 'M')
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')
4
False

示例2:时期索引

import pandas as pd
import numpy as np

# 创建数据
start = pd.Timestamp('2021-01-01')
end = pd.Timestamp('2021-12-31')
dates = pd.date_range(start, end, freq='D')
values = np.random.rand(len(dates))

# 创建时期索引
periods = pd.period_range(start=start, end=end, freq='M')
values = np.random.rand(len(periods))

# 将时间序列转为时期序列
ts = pd.Series(values, index=periods.asfreq('D', 's').to_timestamp())
print(ts)

运行结果:

2021-01-01    0.442483
2021-02-01    0.423914
2021-03-01    0.284900
2021-04-01    0.139248
2021-05-01    0.157061
2021-06-01    0.244979
2021-07-01    0.879292
2021-08-01    0.720761
2021-09-01    0.041419
2021-10-01    0.356255
2021-11-01    0.358286
2021-12-01    0.253302
Freq: MS, dtype: float64

这个例子中,首先创建了一个时间序列ts,然后将它转换为了一个以月份为索引的时期序列,每个时期代表一个月的数据。这样做的好处是可以更方便地进行分组和聚合等操作。

本文链接:http://task.lmcjl.com/news/17427.html

展开阅读全文