创建时间表(时间序列数据)

11.1节介绍了时间序列的创建。有时间序列后,在MATLAB的表或Python的Series和DataFrame中将时间序列设置为索引列,就得到MATLAB中的时间表和Python中的时间序列数据。[大谦MATLAB,dqmatlab点com]

直接创建时间表(时间序列数据)

直接创建时间表或时间序列数据的方法与第10章中表和DataFrame的创建方法基本相同,请参阅。不同之处一是要有一个时间序列作为索引列,二是MATLAB中使用timetable函数进行创建。

【MATLAB】

下面的代码用datetime函数直接创建一个时间序列,然后用timetable函数创建时间表,将时间序列作为时间表的索引列。

code.matlab
>> MyTime=datetime(["2020-01-01"; "2020-01-02"; "2020-01-03"; "2020-01-04"; "2020-01-05"]);
>> Col1=[10;20;15;30;45];
>> Col2=[13;23;18;33;48];
>> Col3= [17;27;22;37;52];
>> TT=timetable(Col1,Col2,Col3,RowTimes=MyTime)
TT =
  5×3 timetable
       Time       Col1    Col2    Col3
    __________    ____    ____    ____
    2020-01-01     10      13      17
    2020-01-02     20      23      27
    2020-01-03     15      18      22
    2020-01-04     30      33      37
    2020-01-05     45      48      52

【Python】

下面的代码用pandas包的date_range函数增量式生成时间序列,然后用DataFrame函数创建DataFrame,并将时间序列作为索引列。

code.python
>>> import pandas as pd
>>> df=pd.DataFrame({'Col1': [10, 20, 15, 30, 45],
                   'Col2': [13, 23, 18, 33, 48],
                   'Col3': [17, 27, 22, 37, 52]},
                  index=pd.date_range('2020-01-01', '2020-01-05'))
>>> df
            Col1  Col2  Col3
2020-01-01    10    13    17
2020-01-02    20    23    27
2020-01-03    15    18    22
2020-01-04    30    33    37
2020-01-05    45    48    52

通过移动已有时间序列数据创建新时间序列数据

11.1.4小节介绍了通过将已有时间序列进行左右偏移来创建新的时间序列,本小节介绍将时间序列数据中的值向上或向下整体移动来创建新的时间序列数据。注意,只是值移动,时间序列或者说索引列不动。

【MATLAB】

MATLAB中使用lag函数实现时间表中值的上下移动。下面创建时间表TT,将值向下移动两行。

code.matlab
>> MyTime=datetime(["2020-01-01"; "2020-01-02"; "2020-01-03"; "2020-01-04"; "2020-01-05"]);
>> Col1=[10;20;15;30;45];
>> Col2=[13;23;18;33;48];
>> Col3= [17;27;22;37;52];
>> TT=timetable(Col1,Col2,Col3,RowTimes=MyTime);
>> TT2=lag(TT,2)
TT2 =
  5×3 timetable
       Time       Col1    Col2    Col3=-\
    __________    ____    ____    ____
    2020-01-01    NaN     NaN     NaN
    2020-01-02    NaN     NaN     NaN
    2020-01-03     10      13      17
    2020-01-04     20      23      27
    2020-01-05     15      18      22

可见,时间表TT2中值整体向下移动了两行。移动后超出时间表的部分被裁剪,上面两行空出的部分用NaN表示为缺失值。

将值向上移动3行,设置lag函数的第2个参数的值为-3。

code.matlab
>> TT3=lag(TT,-3)
TT3 =
  5×3 timetable
       Time       Col1    Col2    Col3
    __________    ____    ____    ____
    2020-01-01     30      33      37
    2020-01-02     45      48      52
    2020-01-03    NaN     NaN     NaN
    2020-01-04    NaN     NaN     NaN
    2020-01-05    NaN     NaN     NaN

【Python】

Python中使用pandas包中DataFrame对象的shift方法来实现。下面创建一个时间序列数据,它本质上是一个DataFrame。

code.python
>>> import pandas as pd
>>> df=pd.DataFrame({'Col1': [10, 20, 15, 30, 45],
                   'Col2': [13, 23, 18, 33, 48],
                   'Col3': [17, 27, 22, 37, 52]},
                  index=pd.date_range('2020-01-01', '2020-01-05'))

用DataFrame对象的shift方法将值整体向下移动2行。

code.python
>>> df.shift(periods=2)
            Col1  Col2  Col3
2020-01-01   NaN   NaN   NaN
2020-01-02   NaN   NaN   NaN
2020-01-03  10.0  13.0  17.0
2020-01-04  20.0  23.0  27.0
2020-01-05  15.0  18.0  22.0

将值整体向上移动3行。

code.python
>>> df.shift(periods=-3)
            Col1  Col2  Col3
2020-01-01  30.0  33.0  37.0
2020-01-02  45.0  48.0  52.0
2020-01-03   NaN   NaN   NaN
2020-01-04   NaN   NaN   NaN
2020-01-05   NaN   NaN   NaN

注意Series对象也有shift方法,即可以对某个单独的列进行上下移动。

code.python
>>> df['Col1'].shift(periods=2)
2020-01-01     NaN
2020-01-02     NaN
2020-01-03    10.0
2020-01-04    20.0
2020-01-05    15.0
Freq: D, Name: Col1, dtype: float64

从文件导入时间表(时间序列数据)

可以从存储时间序列数据的文件中导入MATLAB时间表或Python时间序列数据。下面假设路径“D:\Samples\ch11\”下有一个Excel文件“时间序列.xlsx”,保存时间序列数据如图11-1所示。

Document Image

图11-1 时间序列数据

【MATLAB】

MATLAB中使用readtimetable函数导入指定路径和名称的Excel文件。注意将 VariableNamingRule参数的值设置为 'preserve' 以使用原始列标题作为表变量名称。将RowTimes参数的值设置为'时间',将该列作为时间表的索引列。

code.matlab
>> TT=readtimetable('D:\Samples\ch11\时间序列.xlsx',VariableNamingRule='preserve',RowTimes='时间')
TT =
  100×1 timetable
           时间            测量值
    ___________________    _____
    2022-03-18 00:00:00      5
    2022-03-18 00:59:59      9
    2022-03-18 02:00:00      6
    2022-03-18 03:00:00      9
    2022-03-18 03:59:59      8
             :               :
    2022-03-21 23:00:00      1
    2022-03-22 00:00:00      5
    2022-03-22 00:59:59     10
    2022-03-22 02:00:00      6
    2022-03-22 03:00:00      9

【Python】

Python中使用pandas包的read_excel函数读取Excel文件,代码如下所示:

code.python
>>> import pandas as pd
>>> df=pd.read_excel(r'D:\Samples\ch11\时间序列.xlsx', sheet_name=0, index_col=0, engine='openpyxl')
>>> df
                     测量值
时间
2022-03-18 00:00:00    5
2022-03-18 01:00:00    9
2022-03-18 02:00:00    6
2022-03-18 03:00:00    9
2022-03-18 04:00:00    8
... ...
2022-03-21 23:00:00    1
2022-03-22 00:00:00    5
2022-03-22 01:00:00   10
2022-03-22 02:00:00    6
2022-03-22 03:00:00    9
[100 rows x 1 columns]