Pandas 中的 Period 对象
在 Pandas 中,Period
对象用于表示特定的时间区间(如某个月、某个季度),而不是时间点(后者用 Timestamp
)。它是处理时间序列数据的重要工具,尤其适合需要按固定周期(如月度、季度)分析的场景。
核心概念
-
与
Timestamp
的区别:-
Timestamp
表示具体时刻(如2023-01-01 00:00:00
)。 -
Period
表示时间区间(如2023年1月整月
)。
-
-
关键属性:
-
start_time
:周期起始时间 -
end_time
:周期结束时间 -
freq
:周期频率(如'M'
表示月)
-
创建 Period 对象
import pandas as pd# 创建单个 Period
p = pd.Period("2023-01", freq='M') # 表示 2023年1月整月
print(p)
# 输出: 2023-01# 获取起止时间
print("Start:", p.start_time) # 2023-01-01 00:00:00
print("End: ", p.end_time) # 2023-01-31 23:59:59.999999999
常用频率(freq)别名
别名 | 含义 | 示例 |
---|---|---|
D | 日 | 2023-01-01 |
M | 月 | 2023-01 |
Q | 季度 | 2023Q1 (1-3月) |
A /Y | 年 | 2023 |
H | 小时 | 2023-01-01 12 |
T /min | 分钟 | 2023-01-01 12:30 |
周期运算
p = pd.Period("2023-01", freq='M')# 加减整数 → 移动周期
print(p + 1) # 2023-02 (下个月)
print(p - 2) # 2022-11 (两个月前)# 获取周期长度(天数)
print(p.days_in_month) # 31 (1月有31天)# 周期差(同频率)
p2 = pd.Period("2023-03", freq='M')
print(p2 - p) # 2 (相差2个月)
实际应用场景
1. 创建 Period 序列
# 生成月度周期序列
periods = pd.period_range("2023-01", "2023-06", freq='M')
print(periods)
# 输出: PeriodIndex(['2023-01', '2023-02', ..., '2023-06'], dtype='period[M]')
2. 时间序列重采样
# 将日数据聚合为月数据
ts = pd.Series(data=[10, 20, 15, 30],index=pd.date_range("2023-01-01", periods=4, freq='D')
)monthly = ts.resample('M').sum() # 按月度周期求和
print(monthly.index) # 自动转为 PeriodIndex
3. 周期转换
p = pd.Period("2023-01", freq='M')# 转换为不同频率
print(p.asfreq('Q')) # 2023Q1 (所属季度)
print(p.asfreq('A')) # 2023 (所属年份)
注意事项
-
频率一致性:不同频率的
Period
无法直接运算(需先统一频率)。 -
时区处理:用
tz
参数指定时区(如freq='M', tz='Asia/Shanghai'
)。 -
边界精度:
end_time
包含该周期最后一刻(纳秒级精度)。
通过 Period
,Pandas 提供了对时间区间的原生支持,极大简化了按固定周期汇总、分析数据的流程。结合 PeriodIndex
和重采样功能,可高效处理金融、经济等领域的周期性数据。