第七章:时间序列数据处理


文档摘要

第七章:时间序列数据处理 第七章:Pandas 时间序列数据处理 时间序列数据是数据分析中非常重要的一部分。它按照时间顺序排列,可以用于分析趋势、预测未来以及理解数据随时间的变化。Pandas 提供了强大的工具来处理时间序列数据,本章将深入探讨 Pandas 在时间序列数据处理方面的应用。 7.1 时间序列数据类型 Pandas 使用 对象来表示时间点,使用 对象来表示时间序列索引。 7.1.1 Timestamp 是 Pandas 中最基本的时间序列数据类型,类似于 Python 的 对象。 7.1.2 DatetimeIndex 是一个包含 对象的索引,用于时间序列数据的索引和对齐。 7.2 创建时间序列 Pandas 提供了多种方法来创建时间序列数据。 7.2.

第七章:时间序列数据处理

第七章:Pandas 时间序列数据处理

时间序列数据是数据分析中非常重要的一部分。它按照时间顺序排列,可以用于分析趋势、预测未来以及理解数据随时间的变化。Pandas 提供了强大的工具来处理时间序列数据,本章将深入探讨 Pandas 在时间序列数据处理方面的应用。

7.1 时间序列数据类型

Pandas 使用 Timestamp 对象来表示时间点,使用 DatetimeIndex 对象来表示时间序列索引。

7.1.1 Timestamp

Timestamp 是 Pandas 中最基本的时间序列数据类型,类似于 Python 的 datetime 对象。

import pandas as pd # 创建 Timestamp 对象 ts = pd.Timestamp('2023-10-27 10:00:00') print(ts) print(type(ts)) # 从字符串创建 Timestamp ts_from_str = pd.to_datetime('2023-10-28') print(ts_from_str)

7.1.2 DatetimeIndex

DatetimeIndex 是一个包含 Timestamp 对象的索引,用于时间序列数据的索引和对齐。

# 创建 DatetimeIndex dates = pd.DatetimeIndex(['2023-10-27', '2023-10-28', '2023-10-29']) print(dates) print(type(dates)) # 使用 DatetimeIndex 创建 Series ts_series = pd.Series([1, 2, 3], index=dates) print(ts_series)

7.2 创建时间序列

Pandas 提供了多种方法来创建时间序列数据。

7.2.1 pd.date_range()

pd.date_range() 函数可以生成一个指定范围内的日期序列。

# 创建指定范围的日期序列 dates = pd.date_range('2023-10-01', '2023-10-31') # 默认频率是天 print(dates) # 指定频率 dates_hourly = pd.date_range('2023-10-27', periods=24, freq='H') # H: 小时 print(dates_hourly) dates_monthly = pd.date_range('2023-01-01', periods=12, freq='M') # M: 月 print(dates_monthly)

7.2.2 pd.to_datetime()

pd.to_datetime() 函数可以将字符串、整数或其他格式转换为 Timestamp 对象。

# 将字符串转换为 Timestamp dates_str = ['2023-10-27', '2023-10-28', '2023-10-29'] dates_ts = pd.to_datetime(dates_str) print(dates_ts) # 处理错误 dates_mixed = ['2023-10-27', 'invalid date', '2023-10-29'] dates_ts_corrected = pd.to_datetime(dates_mixed, errors='coerce') # errors='coerce' 将无效日期转换为 NaT print(dates_ts_corrected)

7.3 时间序列索引和切片

使用 DatetimeIndex 可以方便地对时间序列数据进行索引和切片。

# 创建时间序列数据 dates = pd.date_range('2023-10-01', periods=31) data = range(1, 32) ts_series = pd.Series(data, index=dates) # 索引 print(ts_series['2023-10-15']) print(ts_series['2023-10']) # 索引整个月 # 切片 print(ts_series['2023-10-20':'2023-10-25'])

7.4 时间序列频率转换

Pandas 提供了 resample() 方法来改变时间序列的频率。

# 创建时间序列数据 dates = pd.date_range('2023-01-01', periods=365) data = range(1, 366) ts_series = pd.Series(data, index=dates) # 降采样 (Downsampling) monthly_data = ts_series.resample('M').mean() # 按月计算平均值 print(monthly_data) # 升采样 (Upsampling) daily_data = monthly_data.resample('D').ffill() # 将月数据填充到每天 (前向填充) print(daily_data.head())

7.4.1 resample() 方法详解

resample() 方法接受一个频率字符串作为参数,用于指定新的频率。常用的频率字符串包括:

  • 'D':天

  • 'W':周

  • 'M':月

  • 'Q':季度

  • 'Y':年

  • 'H':小时

  • 'T''min':分钟

  • 'S':秒

resample() 方法返回一个 Resampler 对象,可以链式调用聚合函数,例如 mean()sum()count() 等。

7.5 时间序列移动窗口

移动窗口可以用于平滑时间序列数据,突出趋势。Pandas 提供了 rolling() 方法来实现移动窗口计算。

# 创建时间序列数据 dates = pd.date_range('2023-01-01', periods=100) data = range(1, 101) ts_series = pd.Series(data, index=dates) # 移动平均 rolling_mean = ts_series.rolling(window=7).mean() # 7天移动平均 print(rolling_mean.head(10)) # 移动标准差 rolling_std = ts_series.rolling(window=7).std() print(rolling_std.head(10))

7.5.1 rolling() 方法详解

rolling() 方法接受一个 window 参数,用于指定窗口大小。还可以指定其他参数,例如:

  • center:是否将窗口居中对齐。

  • min_periods:窗口内最少需要多少个非缺失值。

7.6 时间序列可视化

时间序列数据可视化可以帮助我们更好地理解数据。Pandas 结合 Matplotlib 可以方便地绘制时间序列图。

import matplotlib.pyplot as plt # 创建时间序列数据 dates = pd.date_range('2023-01-01', periods=100) data = range(1, 101) ts_series = pd.Series(data, index=dates) # 绘制时间序列图 plt.figure(figsize=(12, 6)) plt.plot(ts_series, label='Original Data') plt.plot(ts_series.rolling(window=7).mean(), label='7-Day Moving Average') plt.xlabel('Date') plt.ylabel('Value') plt.title('Time Series Data') plt.legend() plt.show()

7.7 案例分析:股票数据分析

下面我们使用真实的股票数据进行时间序列分析。

# 从 CSV 文件读取股票数据 stock_data = pd.read_csv('stock_data.csv', index_col='Date', parse_dates=True) # 查看数据 print(stock_data.head()) # 绘制收盘价时间序列图 plt.figure(figsize=(12, 6)) plt.plot(stock_data['Close'], label='Close Price') plt.xlabel('Date') plt.ylabel('Price') plt.title('Stock Close Price Time Series') plt.legend() plt.show() # 计算 30 天移动平均 stock_data['MA30'] = stock_data['Close'].rolling(window=30).mean() # 绘制收盘价和移动平均线 plt.figure(figsize=(12, 6)) plt.plot(stock_data['Close'], label='Close Price') plt.plot(stock_data['MA30'], label='30-Day Moving Average') plt.xlabel('Date') plt.ylabel('Price') plt.title('Stock Close Price with 30-Day Moving Average') plt.legend() plt.show()

假设 stock_data.csv 文件内容如下:

Date,Open,High,Low,Close,Volume 2023-01-01,100,102,98,101,1000 2023-01-02,101,103,99,102,1200 2023-01-03,102,104,100,103,1100 2023-01-04,103,105,101,104,1300 2023-01-05,104,106,102,105,1400 ...

7.8 时区处理

Pandas 提供了时区处理功能,可以处理不同时区的时间序列数据。

# 创建带时区的时间戳 ts_utc = pd.Timestamp('2023-10-27 10:00:00', tz='UTC') print(ts_utc) # 转换为其他时区 ts_pacific = ts_utc.tz_convert('US/Pacific') print(ts_pacific) # 创建带时区的 DatetimeIndex dates_utc = pd.date_range('2023-10-27', periods=3, tz='UTC') print(dates_utc)

7.9 总结

本章介绍了 Pandas 在时间序列数据处理方面的常用功能,包括时间序列数据类型、创建时间序列、索引和切片、频率转换、移动窗口以及可视化。掌握这些技能可以帮助你更好地分析和理解时间序列数据。

7.10 Mermaid 图表

下面是一个简单的 Mermaid 图表,展示了时间序列数据处理的流程。

图表解释:

  1. 时间序列数据 是处理的起点。

  2. 创建 DatetimeIndex:将时间数据转换为 Pandas 可以识别的格式。

  3. 索引和切片:根据时间选择数据的子集。

  4. 频率转换:改变时间序列的频率(例如,从天到月)。

  5. 移动窗口:计算滑动窗口的统计量(例如,移动平均)。

  6. 数据分析:使用处理后的数据进行进一步的分析。

  7. 可视化:将结果可视化以便更好地理解。

希望这篇文章对你有所帮助!


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U