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
,然后将它转换为了一个以月份为索引的时期序列,每个时期代表一个月的数据。这样做的好处是可以更方便地进行分组和聚合等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pandas时间序列:时期(period)及其算术运算详解 - Python技术站