python数据分析(十一):Pandas 时间数据处理

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. 总结

  1. 时间数据创建:

    • pd.to_datetime() 从字符串创建时间戳
    • pd.date_range() 创建规则的时间序列
    • 支持多种输入格式和时区设置
  2. 时间属性访问:

    • 轻松获取年、月、日、星期等时间组件
    • 支持判断特殊日期(如月初、月末等)
  3. 时间索引与切片:

    • 使用部分字符串进行灵活索引
    • 支持自然语言风格的时间范围选择
  4. 时间偏移与移位:

    • 使用DateOffset进行精确时间偏移
    • shift()方法移动时间序列
  5. 时间重采样:

    • resample()实现升采样和降采样
    • 支持多种聚合函数和填充方法
  6. 时间窗口操作:

    • rolling()计算滚动统计量
    • expanding()计算扩展窗口统计量
  7. 时区处理:

    • tz_localize()设置时区
    • tz_convert()转换时区
    • 自动处理夏令时
  8. 时间差处理:

    • 精确计算时间差
    • 支持时间差序列操作
  9. 实际应用:

    • 金融数据分析
    • 销售趋势分析
    • 任何时间序列数据处理

Pandas 的时间序列功能强大而全面,可以满足绝大多数时间数据处理需求。掌握这些功能可以让你更高效地处理和分析时间序列数据,从数据中提取有价值的洞察。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值