Pandas中时间序列的处理大全

  • Post category:Python

下面将详细讲解“Pandas中时间序列的处理大全”的完整攻略。

1. Pandas中时间序列数据类型

Pandas中有三个非常重要的时间序列数据类型:Timestamp、DatetimeIndex和Period。

  • Timestamp: 表示一个时间点,可以通过字符串或者Python的时间库创建

  • DatetimeIndex: 由许多Timestamp组成的索引,可以作为Pandas对象的索引

  • Period: 表示一段时间,可以由相应的字符串或者数字创建

2. Pandas中时间序列的创建和转换

2.1 时间序列的创建

可以使用pd.to_datetime方法将字符串转换为Timestamp:

>>> import pandas as pd
>>> pd.to_datetime('2022-01-01')
Timestamp('2022-01-01 00:00:00')

也可以通过pd.date_range方法生成指定时间段内的一系列时间点:

>>> pd.date_range('2022-01-01', periods=3)
DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03'], dtype='datetime64[ns]', freq='D')

2.2 时间序列的转换

DatetimeIndex可以用作DataFrame或Series的索引,转换为DatetimeIndex的方法有多个:

>>> df = pd.read_csv('data.csv')
>>> df['Date'] = pd.to_datetime(df['Date'])   # 将Date列转换为DatetimeIndex
>>> df = df.set_index('Date')                 # 以DatetimeIndex为索引
>>> df.index = pd.to_datetime(df.index, format='%Y-%m-%d')  # 将索引转换为DatetimeIndex

3. Pandas中时间序列的操作

3.1 时间序列的索引与子集操作

在DatetimeIndex中可以使用比较运算符(>、>=、<、<=)进行筛选:

>>> df = pd.read_csv('data.csv', index_col='Date', parse_dates=True)
>>> df[df.index > '2022-01-01']

可以使用loc和iloc方法进行子集的提取:

>>> df.loc['2022-01-01':'2022-01-05']   # 返回Jan 1 到 Jan 5这五天所有数据
>>> df.iloc[1:5]                        # 返回第2行到第5行的所有数据

3.2 重采样

重采样指将时间序列的频率调整为更高或更低的频率。可以通过resample方法实现:

>>> df.resample('M').mean()   # 将数据按月重采样,并计算每月均值

3.3 移动窗口

移动窗口指在一定时间范围内对数据进行聚合,在Pandas中可以通过rolling方法实现。

>>> df.rolling(window=3).mean()   # 对数据按每三个数据点为一个窗口进行均值聚合

示例

示例1:股票价格数据的时间序列分析

可以将股票价格数据读入Pandas中:

import pandas as pd

df = pd.read_csv('stock_prices.csv', index_col='Date', parse_dates=True)

然后可以对其进行时间序列操作:

# 获取最近10天中涨幅最大的两只股票
s = df.pct_change().tail(10).sum(axis=0)
top2 = s.sort_values(ascending=False)[:2].index.tolist()
print(top2)

# 每个月股票行情的统计分析
monthly_return = df.resample('M').last().pct_change()
monthly_statistic = pd.DataFrame()
monthly_statistic['monthly_return'] = monthly_return.mean()
monthly_statistic['monthly_volatility'] = monthly_return.std()

示例2:天气数据的时间序列分析

同样可以读取天气数据到Pandas中:

import pandas as pd

df = pd.read_csv('weather.csv', index_col=0, parse_dates=True)

然后可以进行时间序列操作:

# 获取过去一个月中,最高温度和最低温度之差最大的那天是哪天?
df_last_month = df.resample('D').last().iloc[-30:]
df_last_month['temperature_diff'] = df_last_month['Max Temperature'] - df_last_month['Min Temperature']
max_diff_day = df_last_month['temperature_diff'].idxmax()
print(max_diff_day)

# 每季度气温的平均值和标准差
quarterly_weather = df.resample('Q').mean()
quarterly_weather['temperature_std'] = df.resample('Q').std()['Temperature']