Pandas 时间数据处理全面指南
1. 引言
时间序列数据是数据分析中最常见的数据类型之一,Pandas 提供了强大且灵活的时间序列处理功能。本文将全面介绍 Pandas 中的时间处理功能,包括时间数据的创建、转换、索引、重采样以及各种时间相关操作,通过实际代码示例展示如何使用这些功能。
2. 时间数据的创建
2.1 从字符串创建时间戳
import pandas as pd
# 从字符串创建Timestamp
timestamp = pd.to_datetime('2023-01-15 14:30:00')
print("创建的时间戳:", timestamp)
输出:
创建的时间戳: 2023-01-15 14:30:00
解释:
pd.to_datetime()
可以将多种格式的字符串转换为 Pandas 的 Timestamp 对象- 自动识别常见日期时间格式
2.2 创建时间范围
# 创建时间范围
date_range = pd.date_range('2023-01-01', periods=5, freq='D')
print("\n时间范围:\n", date_range)
输出:
时间范围:
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
'2023-01-05'],
dtype='datetime64[ns]', freq='D')
参数说明:
start
: 开始日期end
/periods
: 结束日期或周期数freq
: 频率('D’表示天,'H’表示小时等)
2.3 从多个字符串创建时间序列
# 从多个字符串创建DatetimeIndex
dates = ['2023-01-01', '2023-01-15', '2023-02-01']
datetime_index = pd.to_datetime(dates)
print("\nDatetimeIndex:\n", datetime_index)
3. 时间数据属性访问
3.1 访问时间组件
# 创建时间序列
ts = pd.Series(range(3), index=pd.date_range('2023-01-01', periods=3, freq='M'))
# 访问时间组件
print("\n年份:", ts.index.year)
print("月份:", ts.index.month)
print("日:", ts.index.day)
print("星期几:", ts.index.dayofweek) # 周一=0, 周日=6
print("季度:", ts.index.quarter)
3.2 判断是否为特定日期
# 判断是否为月初
print("\n是否为月初:", ts.index.is_month_start)
4. 时间数据索引与切片
4.1 基本时间切片
# 创建较长的时间序列
long_ts = pd.Series(range(365), index=pd.date_range('2023-01-01', periods=365))
# 时间切片
print("\n一月份数据:\n", long_ts['2023-01'])
print("\n1月到3月数据:\n", long_ts['2023-01':'2023-03'])
4.2 部分字符串索引
# 部分字符串索引
print("\n所有1月15日的数据:\n", long_ts.loc['2023-01-15'])
print("\n所有1月份的数据:\n", long_ts.loc['2023-01'])
5. 时间偏移与移位
5.1 使用时间偏移
# 时间偏移
from pandas.tseries.offsets import Day, MonthEnd
print("\n原时间:", timestamp)
print("加1天:", timestamp + Day(1))
print("月末:", timestamp + MonthEnd(1))
5.2 时间序列移位
# 时间序列移位
print("\n原始时间序列:\n", ts)
print("\n向后移位2个月:\n", ts.shift(2, freq='M'))
6. 时间重采样
6.1 降采样(低频)
# 创建每分钟数据
minute_ts = pd.Series(range(120), index=pd.date_range('2023-01-01', periods=120, freq='T'))
# 降采样为每小时
hourly = minute_ts.resample('H').mean()
print("\n每小时均值:\n", hourly.head())
6.2 升采样(高频)
# 升采样并填充
upsampled = hourly.resample('30T').ffill()
print("\n升采样结果:\n", upsampled.head())
7. 时间窗口操作
7.1 滚动窗口
# 滚动平均值
rolling = long_ts.rolling(window=7).mean()
print("\n7天滚动平均值:\n", rolling.head(10))
7.2 扩展窗口
# 扩展窗口平均值
expanding = long_ts.expanding().mean()
print("\n扩展窗口平均值:\n", expanding.head(10))
8. 时区处理
8.1 本地化与时区转换
# 本地化并转换时区
ts = pd.date_range('2023-01-01', periods=3, freq='H')
ts_utc = ts.tz_localize('UTC')
print("\nUTC时间:", ts_utc)
print("\n转换为上海时间:", ts_utc.tz_convert('Asia/Shanghai'))
8.2 处理夏令时
# 夏令时示例
ts = pd.date_range('2023-03-12 00:00', periods=5, freq='H', tz='America/New_York')
print("\n夏令时转换:\n", ts)
9. 时间差处理
9.1 计算时间差
# 计算时间差
diff = pd.Timestamp('2023-01-15') - pd.Timestamp('2023-01-10')
print("\n时间差:", diff)
print("天数:", diff.days)
9.2 时间差序列
# 时间差序列
ts = pd.Series(pd.date_range('2023-01-01', periods=5, freq='D'))
deltas = ts.diff()
print("\n时间差序列:\n", deltas)
10. 实际应用案例
10.1 处理股票数据
# 模拟股票数据
stock_data = pd.DataFrame({
'price': [100, 101, 102, 103, 104, 105],
'volume': [1000, 1200, 800, 1500, 2000, 1800]
}, index=pd.date_range('2023-01-03', periods=6, freq='B')) # B=工作日
# 计算5日移动平均
stock_data['5_day_ma'] = stock_data['price'].rolling(5).mean()
print("\n股票数据:\n", stock_data)
10.2 分析销售数据
# 模拟销售数据
sales = pd.Series([120, 135, 150, 110, 125, 140],
index=pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03',
'2023-02-01', '2023-02-02', '2023-02-03']))
# 按月汇总
monthly_sales = sales.resample('M').sum()
print("\n月度销售总额:\n", monthly_sales)
11. 总结
-
时间数据创建:
pd.to_datetime()
从字符串创建时间戳pd.date_range()
创建规则的时间序列- 支持多种输入格式和时区设置
-
时间属性访问:
- 轻松获取年、月、日、星期等时间组件
- 支持判断特殊日期(如月初、月末等)
-
时间索引与切片:
- 使用部分字符串进行灵活索引
- 支持自然语言风格的时间范围选择
-
时间偏移与移位:
- 使用
DateOffset
进行精确时间偏移 shift()
方法移动时间序列
- 使用
-
时间重采样:
resample()
实现升采样和降采样- 支持多种聚合函数和填充方法
-
时间窗口操作:
rolling()
计算滚动统计量expanding()
计算扩展窗口统计量
-
时区处理:
tz_localize()
设置时区tz_convert()
转换时区- 自动处理夏令时
-
时间差处理:
- 精确计算时间差
- 支持时间差序列操作
-
实际应用:
- 金融数据分析
- 销售趋势分析
- 任何时间序列数据处理
Pandas 的时间序列功能强大而全面,可以满足绝大多数时间数据处理需求。掌握这些功能可以让你更高效地处理和分析时间序列数据,从数据中提取有价值的洞察。