6-Pandas时间序列处理的基础(时序数据类型、筛选、子集提取、重复时间索引操作)
一、Pandas中时间序列的类型
Pandas中最为基础的时间序列类型就是以时间戳(通过以Python字符串或datetime对象表示)为索引的Series;
>>> import pandas as pd >>> import numpy as np >>> dates = ['2020-8-1','2020-8-2','2020-8-3','2020-8-4','2020-8-5'] >>> ts = pd.Series(np.random.randint(0,10,5)) >>> ts.index = pd.to_datetime(dates) >>> ts 2020-08-01 5 2020-08-02 5 2020-08-03 9 2020-08-04 7 2020-08-05 7 dtype: int32
二、Pandas中时间序列数据的筛选
关于日期数据的筛选与python基本库中的切片方式一致;
#选取前3条数据 >>> ts[:3] 2020-08-01 5 2020-08-02 5 2020-08-03 9 dtype: int32 #从前往后(正序),每个两个元素取数据 >>> ts[::2] 2020-08-01 5 2020-08-03 9 2020-08-05 7 dtype: int32 #从后往前(逆序),每两个元素取数据 >>> ts[::-2] 2020-08-05 7 2020-08-03 9 2020-08-01 5 dtype: int32
Pandas不同索引之间的时间序列之前的算数运算会自动按日期进行对齐(其实只是Series的特征罢了)
>>> ts+ts[::2] 2020-08-01 10.0 2020-08-02 NaN 2020-08-03 18.0 2020-08-04 NaN 2020-08-05 14.0 dtype: float64
三、Pandas中时间序列数据如何提取子集
(1)通过index[]选取子集
>>> ts.index DatetimeIndex(['2020-08-01', '2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05'], dtype='datetime64[ns]', freq=None) >>> len(ts.index) 5 >>> ts.index[2] Timestamp('2020-08-03 00:00:00') >>> ts[ts.index[2]] 9
(2)通过字符串选取子集,在这需要注意的是:传入的字符串需要能被解析成日期;
也可以传入只包含年或年月的字符串,选取该范围内的子集;
>>> ts['2020-8-1'] 5 >>> ts['2020/8/1'] 5 >>> ts['8/1/2020'] 5 >>> ts['2020-8'] 2020-08-01 5 2020-08-02 5 2020-08-03 9 2020-08-04 7 2020-08-05 7 dtype: int32
(3)通过truncate方法选取子集
truncate()常用参数有after和before,传入参数后,after之后或before之前的数据将全部被删除;
>>> ts.truncate(after='2020-8-3') 2020-08-01 5 2020-08-02 5 2020-08-03 9 dtype: int32 >>> ts.truncate(before='2020-8-3') 2020-08-03 9 2020-08-04 7 2020-08-05 7 dtype: int32
四、带有重复索引的时间序列的操作
在某些应用场景中,通常会存在一个时间点上有多个观测数据的情况,对于带有重复索引的时间序列,一般情况下使用如下两种方法进行操作:
- index.is_unique检查索引日期是否唯一
- 使用groupby()对数据进行分组聚合
>>> dup_ts = pd.Series(np.random.randint(0,5,5)) >>> dup_ts.index = pd.to_datetime(['2020-8-1','2020-8-2','2020-8-2','2020-8-2','2020-8-3']) >>> dup_ts 2020-8-1 3 2020-8-2 0 2020-8-2 2 2020-8-2 2 2020-8-3 0 dtype: int32 >>> dup_ts['2020-8-1'] 3 >>> dup_ts['2020-8-2'] 2020-8-2 0 2020-8-2 2 2020-8-2 2 dtype: int32 #查看时间序列的索引是否唯一 >>> dup_ts.index.is_unique False #使用groupby进行分组聚合 >>> dup_ts.groupby(level=0).sum() 2020-8-1 3 2020-8-2 4 2020-8-3 0 dtype: int32 >>> dup_ts.groupby(level=0).count() 2020-8-1 1 2020-8-2 3 2020-8-3 1 dtype: int64
五、补充
若有一个csv文件,在数据导入是可以通过参数实现将字符串类型的时间设为索引,设定index_col
为0即以数据中第一列为索引,设定parse_dates
为True
,会把索引识别为时间数据类型。
>>>data = pd.read_csv('***.csv',index_col=0,parse_dates=True)