时间序列数据的整理

时间序列数据则是结构化数据类型,是索引列为日期时间数据的Series或DataFrame。本章介绍时间序列数据的整理。[大谦Excel,dqexcel点com]

时间序列数据概述

很多人把时间序列数据与日期时间数据搞混淆,实际上,它们是完全不同的两种数据类型。日期时间数据类型是基本数据类型,时间序列数据则是索引列为日期时间数据的Series或DataFrame,是结构化数据类型。

pandas包中可以使用date_range函数利用给定的起始时间、间隔时间单位和数据个数生成时间序列。

图3-49所示工作表中,A1单元格在Python模式下在公式栏中输入代码:

code.python
start_time=pd.to_datetime('2022-03-18 00:00:00')
data=np.random.randint(1,11,size=100)
time_series=pd.date_range(start=start_time,periods=100,freq='H',name='时间')
series_data=pd.Series(data,index=time_series,name='测量值')
Document Image

图3-49 生成时间序列数据

单击键盘上的Ctrl+Enter键,A1单元格返回一个Series对象。以Excel值的形式显示,如图3-49工作表中A-B列所示。代码中给定起始时间,以小时为时间间隔,生成了100个日期时间数据组成一个序列。用NumPy包的random.randint函数生成了100个1到10之间的随机整数作为测量值。然后将时间序列和测量值组合成一个Series对象,得到需要的时间序列数据。

数据筛选

时间序列数据本质上是索引列为日期时间类型数据的Series或DataFrame,所以Series对象和DataFrame对象的属性和方法对于时间序列数据都适用。

图3-50所示工作表中A-B列是一段时间内产品每天的销量,现在要求筛选出销量大于等于20的日期。D1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:B31",headers=True)
df[df['销量']>=20]

单击键盘上的Ctrl+Enter键,D1单元格返回一个DataFrame对象。显示对象的内容,如图3-50工作表中E-G列所示,销量大于等于20的销售日期被筛选出来了。

Document Image

图3-50 筛选数据

数据偏移

给定一个日期时间数据序列,再指定一个日期或时间间隔,即偏移,可以快速得到偏移后的日期时间数据序列。这个日期间隔,可以是普通的日期,也可以是工作日。

图3-51所示工作表中A-C列是部分员工休假时间的安排,包括休假开始日期和休假天数。现在要求计算出休假结束日期。D1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:C7",headers=True)
df['休假结束日期']=df.apply(lambda x: x.休假开始日期+pd.DateOffset(days=x.休假天数), axis=1)
df

单击键盘上的Ctrl+Enter键,D1单元格返回一个DataFrame对象。显示对象的内容,如图3-51工作表中E-H列所示。代码使用匿名函数,用DataFrame对象的apply方法利用休假天数对休假开始日期进行了数据转换。用pandas包的DateOffset函数将休假天数处理成了偏移量,直接与休假开始日期相加得到结束日期。

Document Image

图3-51 计算休假结束日期

数据重采样

对于给定的时间序列数据,按照指定的频率进行重采样,并按指定的函数进行聚合。图3-52所示工作表中A-B列是一段时间内每小时的测量值,现在要求根据该数据进行重采样,得到每天的测量值,每天的测量值为该天各小时测量值的平均值。

D1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:B101",headers=True)
#将“时间”列设置为索引列
df=df.set_index('时间')
#按天重采样,聚合函数为mean,求均值,结果保留2位小数
df2=df.resample('D').mean().round(2)

单击键盘上的Ctrl+Enter键,D1单元格返回一个DataFrame对象。显示对象的内容,如图3-52工作表中E-F列所示。代码用DataFrame对象的set_index方法将“时间”列设置为索引列,然后用resample方法按天对原数据进行重采样,用mean方法求该天每小时数据的均值作为该天的测量值。

Document Image

图3-52 数据重采样

数据平滑

通过窗口移动平均可以对时间序列数据进行平滑处理。方法是设定一个指定大小的可以上下移动的窗口,例如,如果窗口大小为5,则它覆盖时间序列数据中的连续5个数据。此时窗口中心的值取为窗口内所有数据的平均值。也常取窗口内数据的中值。

图3-53所示工作表中A-B列是一段时间内每小时的测量值,现在要求对该数据进行平滑处理,取窗口的大小为5。C1单元格在Python模式下在公式栏中输入代码:

code.python
df=xl("A1:B101",headers=True)
#将“时间”列设置为索引列
df=df.set_index('时间')
#求窗口大小为5的移动平均值
smoothed_data=df.rolling(window=5).mean()
#用原始数据绘制线形图,绿色实线
plt.plot(df.index,df.values,'g-',label='Raw Data')
#用平滑后的数据绘制线形图,红色实线,添加星号点标记
plt.plot(smoothed_data.index,smoothed_data.values,'r-*',label='Smoothed Data',linewidth=2)
#设置标签和图例中的字体大小为16磅
plt.xlabel('Time',fontsize=16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.legend(fontsize=16)

单击键盘上的Ctrl+Enter键,C1单元格返回一个Image对象。显示对象的内容,合并单元格区域D1:I19,结果如图3-53所示。代码用DataFrame对象的set_index方法将“时间”列设置为索引列,用rolling方法使用大小为5的窗口对原始数据进行平滑,得到平滑后的数据。然后用原始数据和平滑后的数据绘线形图,如图3-53所示。平滑后的线形图添加了星形点。可见,平滑后的线形图比原始数据绘制的线形图的上下波动幅度小很多,更平滑了。

Document Image

图3-53 数据平滑