下面将详细讲解“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']