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. 周期与时间戳对比

特性TimestampPeriod
表示时间点(瞬时)时间段(区间)
精度纳秒由频率决定
运算加减 Timedelta加减整数(频率单位)
适用事件时间戳周期汇总数据(月/季/年)

小结

  • Period 表示固定频率的时间段
  • 支持 start_time、end_time、year 等属性
  • 支持 asfreq 进行频率转换
  • PeriodIndex 适合按月/季度聚合分析