Pandas 時(shí)間序列相關(guān)總結(jié)
1. 前言
前面四小節(jié)我們通過 Pandas 時(shí)間序列的概述,常用三種時(shí)間序列類型的創(chuàng)建、常用屬性和方法,以及對(duì)應(yīng)的索引類型的的創(chuàng)建和使用等知識(shí)的學(xué)習(xí),基本掌握了時(shí)間序列數(shù)據(jù)類型的處理方法,本小節(jié)我們將對(duì)時(shí)間序列的相關(guān)知識(shí)進(jìn)行總結(jié),以及這三種常用時(shí)間序列類型的相互轉(zhuǎn)換,通過進(jìn)一步的學(xué)習(xí),幫助我們今后更加高效的處理和分析時(shí)間序列相關(guān)的數(shù)據(jù)集。
2. 頻率和偏移
我們?cè)趯W(xué)習(xí)三種時(shí)間序列類型時(shí),經(jīng)常會(huì)接觸到創(chuàng)建對(duì)象時(shí)指定的頻率和時(shí)間偏移量,Pandas 時(shí)間序列中提供了時(shí)間或日期偏移量,對(duì)于每一個(gè)偏移量的 Pandas 都有對(duì)應(yīng)的頻率值:
頻率值 | 偏移量 | 說明 |
---|---|---|
D | Day | 日歷日 |
H | Hour | 小時(shí) |
T 或 min | Minute | 分 |
S | Second | 秒 |
L 或 ms | Milli | 毫秒 |
U | Micro | 微秒 |
M | MonthEnd | 每月最后一個(gè)日歷日 |
BM | BusinessMonthEnd | 每月最后一個(gè)工作日 |
3. 時(shí)間序列類型轉(zhuǎn)換
我們?cè)谟玫綍r(shí)間序列的三種常用類型時(shí),經(jīng)常要用到他們之間的相互轉(zhuǎn)換,便于我們對(duì)數(shù)據(jù)的進(jìn)一步分析處理。下面我們就來學(xué)習(xí)一下用于時(shí)間序列類型轉(zhuǎn)換的三個(gè)函數(shù):
2.1 to_datetime() 函數(shù)
該函數(shù)將數(shù)據(jù)值轉(zhuǎn)換為時(shí)間戳。
pd.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin='unix', cache=True)
參數(shù)名 | 說明 |
---|---|
arg | 要轉(zhuǎn)為時(shí)間戳對(duì)象的內(nèi)容,類型可以為 str、int、float 等等 |
errors | 對(duì)于無效解析的相應(yīng)方式有三種值:ignore,raise,coerce,默認(rèn)是 raise |
exact | 精度 |
format | 解析出來的時(shí)間格式 |
下面我們通過代碼演示將一個(gè)日期時(shí)間格式的字符串轉(zhuǎn)換為時(shí)間戳 Timestamp :
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
# 通過 to_datetime() 將 str 數(shù)據(jù)類型 函數(shù)轉(zhuǎn)換為 時(shí)間戳
pd.to_datetime('2020-01-03')
# --- 輸出結(jié)果 ---
Timestamp('2020-01-03 00:00:00')
2.2 to_period() 函數(shù)
該函數(shù)用于將時(shí)間戳轉(zhuǎn)換為時(shí)期數(shù)據(jù)。轉(zhuǎn)換時(shí)要指定轉(zhuǎn)換的頻率,因?yàn)闀r(shí)間戳表示的是固定的時(shí)間點(diǎn),而時(shí)期表示的是時(shí)間區(qū)間。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
tms_res=pd.Timestamp('2020-11-23 10:40:00')
print(tms_res)
# --- 輸出結(jié)果 ---
2020-11-23 10:40:00
# 通過 to_period 函數(shù)指定轉(zhuǎn)換頻率,轉(zhuǎn)換成時(shí)期對(duì)象
period_res=tms_res.to_period('H')
print(period_res)
print(type(period_res))
# --- 輸出結(jié)果 ---
2020-11-23 10:00
<class 'pandas._libs.tslibs.period.Period'>
2.3 to_timestamp() 函數(shù)
該函數(shù)用于將時(shí)期數(shù)據(jù)轉(zhuǎn)換為時(shí)間戳。
# 導(dǎo)入 pandas 數(shù)據(jù)包
import pandas as pd
# 定義時(shí)期對(duì)象
period_res=pd.Period('2020-11-23 10:40')
print(period_res)
# --- 輸出結(jié)果 ---
2020-11-23 10:40
# 通過函數(shù) to_timetamp() 轉(zhuǎn)換為 時(shí)間戳
tms_res=period_res.to_timestamp()
print(tms_res)
print(type(tms_res))
# --- 輸出結(jié)果 ---
2020-11-23 10:40:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
# 還可以通過 how 參數(shù)指定日期的開始還是結(jié)束時(shí)間進(jìn)行轉(zhuǎn)換為時(shí)間戳
tms_res=period_res.to_timestamp(how='end')
print(tms_res)
# --- 輸出結(jié)果 ---
2020-11-23 10:40:59.999999999
4. 重采樣
Pandas 時(shí)間序列重采樣,是指將時(shí)間序列從一個(gè)頻率轉(zhuǎn)換為另外一個(gè)頻率的操作,主要是通過函數(shù) resample () 進(jìn)行實(shí)現(xiàn)的,采樣又可以分為降采樣(高頻率的數(shù)據(jù)聚合到低頻率的數(shù)據(jù)),升采樣(低頻率數(shù)據(jù)轉(zhuǎn)換為高頻率數(shù)據(jù))。
resample(rule, axis=0, closed=None, label=None, convention='start', kind=None, loffset=None, base=None, on=None, level=None, origin='start_day', offset=None)
下面是該函數(shù)常用參數(shù)的說明:
參數(shù)名 | 說明 |
---|---|
rule | 轉(zhuǎn)換的偏移規(guī)則 |
axis | 默認(rèn)是縱軸 (axis=0) |
closed | 降采樣時(shí),哪一端是閉合的,默認(rèn)是 right |
label | 降采樣時(shí),設(shè)置聚合值的標(biāo)簽 |
convention | 重采樣時(shí)期時(shí),低頻率轉(zhuǎn)換為高頻率所采用的約定,默認(rèn)是 end |
下面我們通過代碼演示一下該函數(shù)的使用:
# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第25小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
時(shí)間 人數(shù) 銷售數(shù)量
0 2020-01-02 12:25:00 12 234
1 2020-01-02 12:30:00 23 300
2 2020-01-02 12:35:00 44 345
3 2020-01-02 12:40:00 56 401
4 2020-01-02 12:45:00 60 420
5 2020-01-02 12:50:00 70 623
# 將時(shí)間列的 str 值轉(zhuǎn)換為 時(shí)間戳索引
data.index=pd.to_datetime(data['時(shí)間'])
del(data['時(shí)間'])
print(data)
# --- 輸出結(jié)果 ---
人數(shù) 銷售數(shù)量
時(shí)間
2020-01-02 12:25:00 12 234
2020-01-02 12:30:00 23 300
2020-01-02 12:35:00 44 345
2020-01-02 12:40:00 56 401
2020-01-02 12:45:00 60 420
2020-01-02 12:50:00 70 623
# 1. 降采樣 我們之前的采樣的頻率為 5 分鐘,我們將采樣頻率調(diào)整為 10 分鐘
ss=data.resample('10MIN').mean()
print(ss)
# --- 輸出結(jié)果 ---
人數(shù) 銷售數(shù)量
時(shí)間
2020-01-02 12:20:00 12.0 234.0
2020-01-02 12:30:00 33.5 322.5
2020-01-02 12:40:00 58.0 410.5
2020-01-02 12:50:00 70.0 623.0
# 2.升采樣 我們將之前的采樣頻率 5 分鐘,改成 2 分鐘進(jìn)行重采樣,這里注意 默認(rèn)使用 NaN 進(jìn)行填充
ss=data.resample('3MIN').mean()
print(ss)
# --- 輸出結(jié)果 ---
人數(shù) 銷售數(shù)量
時(shí)間
2020-01-02 12:24:00 12.0 234.0
2020-01-02 12:27:00 NaN NaN
2020-01-02 12:30:00 23.0 300.0
2020-01-02 12:33:00 44.0 345.0
2020-01-02 12:36:00 NaN NaN
2020-01-02 12:39:00 56.0 401.0
2020-01-02 12:42:00 NaN NaN
2020-01-02 12:45:00 60.0 420.0
2020-01-02 12:48:00 70.0 623.0
5. 小結(jié)
本小節(jié)我們主要對(duì)時(shí)間序列的知識(shí)進(jìn)行總結(jié),主要包括時(shí)間序列頻率和偏移的概念,數(shù)據(jù)類型之間的轉(zhuǎn)換,數(shù)據(jù)的重采樣。本節(jié)課程的重點(diǎn)如下:
- 時(shí)間序列數(shù)據(jù)類型之間的轉(zhuǎn)換函數(shù) to_datetime () , to_period () , to_timestamp ();
- 重采樣函數(shù) resample () 的應(yīng)用。