Period 表示固定频率的时间段(如某个月、某个季度),适合分析周期性数据(财务报告、月度统计等)。它比时间戳更侧重于“区间”概念。
1. 创建周期
从字符串创建
import pandas as pd
p = pd.Period('2024-01', freq='M') # 2024-01(月度)
p_d = pd.Period('2024-01-15', freq='D') # 2024-01-15(日度)
p_q = pd.Period('2024Q1', freq='Q') # 2024Q1(季度)
p_y = pd.Period('2024', freq='Y') # 2024(年度)
从时间戳转换
ts = pd.Timestamp('2024-03-15 12:00:00')
p = ts.to_period('M') # 2024-03
p = ts.to_period('Q') # 2024Q1
批量创建周期索引
idx = pd.period_range('2024-01', periods=3, freq='M')
# PeriodIndex(['2024-01', '2024-02', '2024-03'], dtype='period[M]')
2. 周期属性
| 属性 | 说明 |
|---|
.freq | 频率对象(如 <MonthEnd>) |
.freqstr | 频率字符串(如 'M') |
.year | 年 |
.month | 月 |
.day | 日(周期为日时) |
.quarter | 季度 |
.week | 周数 |
.dayofweek | 星期几 |
.start_time | 周期开始时间 |
.end_time | 周期结束时间 |
.days_in_month | 当月天数 |
p = pd.Period('2024-02', freq='M')
p.year # 2024
p.month # 2
p.quarter # 1
p.start_time # 2024-02-01 00:00:00
p.end_time # 2024-02-29 23:59:59.999999999
p.days_in_month # 29(闰年)
3. 周期方法
| 方法 | 说明 |
|---|
.to_timestamp(how='start') | 转为时间段开始/结束时间戳 |
.asfreq(freq) | 更改频率(不改变时间点) |
.strftime(format) | 格式化 |
.now(freq) | 当前周期 |
p = pd.Period('2024-03', freq='M')
p.to_timestamp() # 2024-03-01 00:00:00
p.to_timestamp(how='end') # 2024-03-31 23:59:59.999999999
p.asfreq('D') # 2024-03-01(取开始日)
p.asfreq('Q') # 2024Q1
4. 周期运算
p = pd.Period('2024-01', freq='M')
p + 1 # 2024-02
p - 1 # 2023-12
p - 3 # 2023-10
# 周期差(以频率为单位)
p2 = pd.Period('2024-05', freq='M')
p2 - p # 4
与时间戳互转
p = pd.Period('2024-02', freq='M')
ts = p.to_timestamp() # 2024-02-01
ts.to_period('M') # 2024-02
5. 周期索引(PeriodIndex)
idx = pd.period_range('2024-01', periods=4, freq='M')
df = pd.DataFrame({'值': [10, 20, 30, 40]}, index=idx)
# 属性
df.index.year # Index([2024, 2024, 2024, 2024])
df.index.quarter # Index([1, 1, 1, 1])
df.index.start_time # DatetimeIndex(['2024-01-01', ...])
# 频率转换
df.index.asfreq('Q') # PeriodIndex(['2024Q1', '2024Q1', '2024Q2', '2024Q2'])
df.index.to_timestamp()
周期索引切片
df.loc['2024-01':'2024-02'] # 包含端点
df['2024-03'] # 返回 2024-03 的行
6. 周期与时间戳对比
| 特性 | Timestamp | Period |
|---|
| 表示 | 时间点(瞬时) | 时间段(区间) |
| 精度 | 纳秒 | 由频率决定 |
| 运算 | 加减 Timedelta | 加减整数(频率单位) |
| 适用 | 事件时间戳 | 周期汇总数据(月/季/年) |
Period 表示固定频率的时间段
- 支持
start_time、end_time、year 等属性
- 支持
asfreq 进行频率转换
PeriodIndex 适合按月/季度聚合分析