时间索引是时间序列分析的基础。本节介绍三种时间索引的创建、属性、切片与筛选方法。


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
  • 支持标签切片(包含端点)和位置切片(不含端点)
  • 支持部分字符串选择(年、月、日)
  • 可相互转换、时区处理、补齐缺失时间点