第七章:时间序列数据处理 第七章:Pandas 时间序列数据处理 时间序列数据是数据分析中非常重要的一部分。它按照时间顺序排列,可以用于分析趋势、预测未来以及理解数据随时间的变化。Pandas 提供了强大的工具来处理时间序列数据,本章将深入探讨 Pandas 在时间序列数据处理方面的应用。 7.1 时间序列数据类型 Pandas 使用 对象来表示时间点,使用 对象来表示时间序列索引。 7.1.1 Timestamp 是 Pandas 中最基本的时间序列数据类型,类似于 Python 的 对象。 7.1.2 DatetimeIndex 是一个包含 对象的索引,用于时间序列数据的索引和对齐。 7.2 创建时间序列 Pandas 提供了多种方法来创建时间序列数据。 7.2.
时间序列数据是数据分析中非常重要的一部分。它按照时间顺序排列,可以用于分析趋势、预测未来以及理解数据随时间的变化。Pandas 提供了强大的工具来处理时间序列数据,本章将深入探讨 Pandas 在时间序列数据处理方面的应用。
Pandas 使用 Timestamp 对象来表示时间点,使用 DatetimeIndex 对象来表示时间序列索引。
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)
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)
Pandas 提供了多种方法来创建时间序列数据。
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)
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)
使用 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'])
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())
resample() 方法详解resample() 方法接受一个频率字符串作为参数,用于指定新的频率。常用的频率字符串包括:
'D':天
'W':周
'M':月
'Q':季度
'Y':年
'H':小时
'T' 或 'min':分钟
'S':秒
resample() 方法返回一个 Resampler 对象,可以链式调用聚合函数,例如 mean()、sum()、count() 等。
移动窗口可以用于平滑时间序列数据,突出趋势。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))
rolling() 方法详解rolling() 方法接受一个 window 参数,用于指定窗口大小。还可以指定其他参数,例如:
center:是否将窗口居中对齐。
min_periods:窗口内最少需要多少个非缺失值。
时间序列数据可视化可以帮助我们更好地理解数据。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()
下面我们使用真实的股票数据进行时间序列分析。
# 从 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 ...
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)
本章介绍了 Pandas 在时间序列数据处理方面的常用功能,包括时间序列数据类型、创建时间序列、索引和切片、频率转换、移动窗口以及可视化。掌握这些技能可以帮助你更好地分析和理解时间序列数据。
下面是一个简单的 Mermaid 图表,展示了时间序列数据处理的流程。
图表解释:
时间序列数据 是处理的起点。
创建 DatetimeIndex:将时间数据转换为 Pandas 可以识别的格式。
索引和切片:根据时间选择数据的子集。
频率转换:改变时间序列的频率(例如,从天到月)。
移动窗口:计算滑动窗口的统计量(例如,移动平均)。
数据分析:使用处理后的数据进行进一步的分析。
可视化:将结果可视化以便更好地理解。
希望这篇文章对你有所帮助!