十二、處理時間序列
1.Python的日期與時間工具
1)Python原生的日期使勁按工具:datetime和dateutil
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
2)時間類型數組:Numpy的datetime64類型
性能相對原生工具好
NumPy 會自動判斷輸入時間需要使用的時間單位,也可使設置格式。
代碼 | 含義 | 時間跨度 (相對) | 時間跨度 (絕對) |
---|---|---|---|
Y | 年(year) | ± 9.2e18 年 | [9.2e18 BC, 9.2e18 AD] |
M | 月(month) | ± 7.6e17 年 | [7.6e17 BC, 7.6e17 AD] |
W | 周(week) | ± 1.7e17 年 | [1.7e17 BC, 1.7e17 AD] |
D | 日(day) | ± 2.5e16 年 | [2.5e16 BC, 2.5e16 AD] |
h | 時(hour) | ± 1.0e15 年 | [1.0e15 BC, 1.0e15 AD] |
m | 分(minute) | ± 1.7e13 年 | [1.7e13 BC, 1.7e13 AD] |
s | 秒(second) | ± 2.9e12 年 | [ 2.9e9 BC, 2.9e9 AD] |
ms | 毫秒(millisecond) | ± 2.9e9 年 | [ 2.9e6 BC, 2.9e6 AD] |
us | 微秒(microsecond) | ± 2.9e6 年 | [290301 BC, 294241 AD] |
ns | 納秒(nanosecond) | ± 292 年 | [ 1678 AD, 2262 AD] |
ps | 皮秒(picosecond) | ± 106 天 | [ 1969 AD, 1970 AD] |
fs | 飛秒(femtosecond) | ± 2.6 小時 | [ 1969 AD, 1970 AD] |
as | 原秒(attosecond) | ± 9.2 秒 | [ 1969 AD, 1970 AD] |
3)pandas的日期時間工具:Timestamp 對象
Pandas 所有關於日期與時間的處理方法全部都是通過 Timestamp 對象實現的,它利用numpy.datetime64 的有效存儲和向量化接口將 datetime 和 dateutil 的易用性有機結合起來。
註釋:datetime.timedelta對象代表兩個時間之間的時間差,兩個date或datetime對象相減就可以返回一個timedelta對象
2.Pandas時間序列:用時間作索引
Pandas時間序列工具非常適合用來處理帶時間戳的索引數據。pd.DatetimeIndex可以構建一個時間index
同樣可以使用series取值方法
再次基礎上還可以彙總取值
3.Pandas時間序列數據結構
時間戳數據:原生timestamp- numpy.datetime64 -->pandas.timestamp。對應的索引數據結構是 DatetimeIndex。
時間週期數據: numpy.datetime64 將固定頻率的時間間隔進行編碼–>pandas.Period。對應的索引數據結構是 PeriodIndex。
時間增量和持續時間:原生datetime.timedelta -numpy.timedelta64->pands.Timedelta。對應的索引數據結構是 TimedeltaIndex。
- pd.to_datetime()可以將很多日期格式解析成pandas.timestamp,任何 DatetimeIndex 類型都可以通過 to_period() 方法和一個頻率代碼轉換成 PeriodIndex類型。
當用一個日期減去另一個日期時,返回的結果是 TimedeltaIndex 類型
- 有規律的時間序列
pd.date_range() 可以處理時間戳、 pd.period_range() 可以處理週期、 pd.timedelta_range() 可以處理時間間隔。
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
4.時間頻率與偏移量
代碼 | 描述 | 代碼 | 描述 |
---|---|---|---|
D | 天(calendar day,按日曆算,含雙休日) | B | 天(business day,僅含工作日) |
W | 周(weekly) | ||
M | 月末(month end) | BM | 月末(business month end,僅含工作日) |
Q | 季末(quarter end) | BQ | 季末(business quarter end,僅含工作日) |
A | 年末(year end) | BA | 年末(business year end,僅含工作日) |
H | 小時(hours) | BH | 小時(business hours,工作時間) |
T | 分鐘(minutes) | ||
S | 秒(seconds) | ||
L | 毫秒(milliseonds) | ||
U | 微秒(microseconds) | ||
N | 納秒(nanoseconds) |
代碼 | 頻率 |
---|---|
MS | 月初(month start) |
BMS | 月初(business month start,僅含工作日) |
QS | 季初(quarter start) |
BQS | 季初(business quarter start,僅含工作日) |
AS | 年初(year start) |
BAS | 年初(business year start,僅含工作日) |
在頻率代碼後面加三位月份縮寫字母來改變季、年頻率的開始時間
所有這些頻率代碼都對應 Pandas 時間序列的偏移量,具體內容可以在pd.tseries.offsets模塊中找到。例如from pandas.tseries.offsets import BDay
,參數freq=BDay()
等價與freq='B'
5.重新取樣、遷移和窗口
1)重新取樣與頻率轉換
處理時間序列數據時,經常需要按照新的頻率(更高頻率、更低頻率)對數據進行重新取樣。你可以通過 resample() 方法解決這個問題,或者用更簡單的 asfreq() 方法。這兩個方法的主要差異在於, resample() 方法是以數據累計(data aggregation,計算平均之類)爲基礎,而asfreq() 方法是以數據選擇(data selection,最後一天之類)爲基礎。
2)時間遷移
另一種常用的時間序列操作是對數據按時間進行遷移。 Pandas 有兩種解決這類問題的方法: shift() 和 tshift()。簡單來說, shift() 就是遷移數據,而 tshift() 就是遷移索引。
3) 移動時間窗口
Pandas 處理時間序列數據的第 3 種操作是移動統計值(rolling statistics)。這些指標可以通過 Series 和 DataFrame 的 rolling() 屬性來實現,它會返回與 groupby 操作類似的結果