一、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)