时间索引是时间序列分析的基础。本节介绍三种时间索引的创建、属性、切片与筛选方法。
1. DatetimeIndex(时间戳索引)
创建
import pandas as pd
# 使用 date_range
idx = pd.date_range('2024-01-01', periods=5, freq='D')
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'])
# 指定起止
idx2 = pd.date_range('2024-01-01', '2024-01-10', freq='D')
# 指定频率
idx3 = pd.date_range('2024-01-01', periods=6, freq='h') # 每小时
idx4 = pd.date_range('2024-01-01', periods=3, freq='ME') # 月末
idx5 = pd.date_range('2024-01-01', periods=3, freq='B') # 工作日常用参数
| 参数 | 说明 |
|---|---|
start | 开始时间 |
end | 结束时间 |
periods | 生成数量 |
freq | 频率代码或 DateOffset |
tz | 时区 |
normalize | 是否归一到午夜 |
2. 时间索引属性
idx = pd.date_range('2024-01-01', periods=6, freq='D')
idx.year # Index([2024, 2024, ...])
idx.month # Index([1, 1, ...])
idx.day # Index([1, 2, 3, ...])
idx.weekday # 星期几(0=周一)
idx.quarter # 季度
idx.dayofyear # 一年中的第几天
idx.is_month_start # 是否月初
idx.is_month_end # 是否月末
idx.is_leap_year # 是否闰年
idx.freq # <Day>
idx.freqstr # 'D'
idx.tz # 时区(None 表示无)3. 时间索引的切片与选择
标签切片(包含端点)
df = pd.DataFrame(
{'值': range(10)},
index=pd.date_range('2024-01-01', periods=10, freq='D')
)
# 字符串切片(自动解析)
df['2024-01-03':'2024-01-06']
# 按年份切片
df['2024']
# 按月切片
df['2024-01']
# 混合切片
df.loc['2024-01-03':'2024-01-05']部分字符串选择
df['2024-01-05'] # 单日数据(返回 Series)
df.loc['2024-01-05'] # 同上位置切片
df.iloc[0:3] # 前 3 行
df.iloc[5:] # 从第 6 行开始truncate 截取
df.truncate(before='2024-01-03', after='2024-01-07')按时间筛选(at_time / between_time)
# 筛选特定时刻(需要更高频率数据)
df_hourly.at_time('12:00')
# 筛选时间段
df_hourly.between_time('09:00', '17:00')4. TimedeltaIndex(时间差索引)
idx = pd.timedelta_range('1 day', periods=3, freq='D')
df = pd.DataFrame({'值': [10, 20, 30]}, index=idx)
# 切片
df['1 day':'3 days']
# 属性
df.index.days # Index([1, 2, 3])
df.index.total_seconds() # Float64Index([86400.0, ...])5. PeriodIndex(周期索引)
idx = pd.period_range('2024-01', periods=4, freq='M')
df = pd.DataFrame({'值': [10, 20, 30, 40]}, index=idx)
# 周期切片(包含端点)
df.loc['2024-01':'2024-03']
# 部分匹配
df.loc['2024-02'] # 返回 2024-02 行
# 属性
df.index.year # Index([2024, 2024, ...])
df.index.start_time # DatetimeIndex(['2024-01-01', ...])6. 时间索引的其他操作
重采样索引
# 使索引拥有固定频率
df.asfreq('D')
df.resample('D').ffill()索引转换
# DatetimeIndex → PeriodIndex
df.to_period('M')
# PeriodIndex → DatetimeIndex
df.index.to_timestamp()
# 时区处理
df.index.tz_localize('UTC')
df.index.tz_convert('Asia/Shanghai')缺失时间点补齐
full_idx = pd.date_range(df.index.min(), df.index.max(), freq='D')
df = df.reindex(full_idx).fillna(method='ffill')小结
- 三种时间索引:
DatetimeIndex、TimedeltaIndex、PeriodIndex- 支持标签切片(包含端点)和位置切片(不含端点)
- 支持部分字符串选择(年、月、日)
- 可相互转换、时区处理、补齐缺失时间点