重新取样时间序列数据意味着按新的时间段对数据进行总结或汇总。
我们可以使用下面的基本语法在Python中重新取样时间序列数据:
#find sum of values in column1 by month
weekly_df['column1'] = df['column1'].resample('M').sum()
#find mean of values in column1 by week
weekly_df['column1'] = df['column1'].resample('W').mean()
注意,我们可以通过不同的时间段对时间序列数据进行重新取样,包括:
- S: 秒
- min: 分钟
- H: 小时
- D: 日
- W: 周
- M: 月
- Q: 季度
- A: 年
下面的例子说明了如何在实践中对时间序列数据进行再取样。
例子:在Python中重新取样时间序列数据
假设我们有下面这个pandas DataFrame,它显示了某个公司在一年内每小时的总销售额:
import pandas as pd
import numpy as np
#make this example reproducible
np.random.seed(0)
#create DataFrame with hourly index
df = pd.DataFrame(index=pd.date_range('2020-01-06', '2020-12-27', freq='h'))
#add column to show sales by hour
df['sales'] = np.random.randint(low=0, high=20, size=len(df.index))
#view first five rows of DataFrame
df.head()
sales
2020-01-06 00:00:00 12
2020-01-06 01:00:00 15
2020-01-06 02:00:00 0
2020-01-06 03:00:00 3
2020-01-06 04:00:00 3
如果我们创建一个线图来可视化销售数据,它看起来会是这样的:
import matplotlib.pyplot as plt
#plot time series data
plt.plot(df.index, df.sales, linewidth=3)

这个图很难解读,所以我们可以改成按周汇总销售数据:
#create new DataFrame
weekly_df = pd.DataFrame()
#create 'sales' column that summarizes total sales by week
weekly_df['sales'] = df['sales'].resample('W').sum()
#view first five rows of DataFrame
weekly_df.head()
sales
2020-01-12 1519
2020-01-19 1589
2020-01-26 1540
2020-02-02 1562
2020-02-09 1614
这个新的数据框架显示了各周的销售额之和。
然后我们可以用这个周数据创建一个时间序列图:
import matplotlib.pyplot as plt
#plot weekly sales data
plt.plot(weekly_df.index, weekly_df.sales, linewidth=3)

这个图更容易阅读,因为我们只绘制了51个单独星期的销售数据,而不是第一个例子中8,545个单独小时的销售数据。
注意:在这个例子中,我们按周总结了销售数据,但如果我们想绘制更少的数据点,我们也可以按月或季度进行总结。
其他资源
下面的教程解释了如何在Python中进行其他常见的操作:
如何在Matplotlib中绘制时间序列
如何在Seaborn中绘制时间序列
如何在Python中计算时间序列的MAPE