如何在Python中重新取样时间序列数据(附实例)

102 阅读2分钟

重新取样时间序列数据意味着按新的时间段对数据进行总结或汇总。

我们可以使用下面的基本语法在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