Pandas時間序列重采樣(resample)方法中closed、label的作用

目錄

  • Pandas重采樣方法resample
  • 降采樣
  • 升采樣

Pandas提供了便捷的方式對時間序列進行重采樣璧南,根據時間粒度的變大或者變小分為降采樣和升采樣:

  • 降采樣:時間粒度變大伶授。例如涮因,原來是按天統(tǒng)計的數據拒迅,現(xiàn)在變成按周統(tǒng)計沥寥。降采樣會涉及到數據的聚合颤练,比如天數據變成周數據既忆,那么就得對一周的7天數據聚合,聚合的方式可以是求和嗦玖,求均值等等患雇。
  • 升采樣:時間粒度變小。例如宇挫,原來是按周統(tǒng)計的數據苛吱,現(xiàn)在變成按天統(tǒng)計。升采樣會涉及到數據的填充器瘪,根據填充的方法不同填充的數據也就不同翠储。

下面涉及的例子绘雁,都需要導入numpy和pandas(如下),并且對于降采樣數據的聚合做簡單的求和處理援所。
import numpy as np
import pandas as pd

Pandas重采樣方法resample

在Pandas里庐舟,通過resample來處理重采樣,根據頻率的不同(freq)會處理成降采樣或者升采樣住拭。我們先來看看Resample的定義和關鍵參數注釋:

resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0, on=None, level=None)
    Convenience method for frequency conversion and resampling of time
    series.  Object must have a datetime-like index (DatetimeIndex,
    PeriodIndex, or TimedeltaIndex), or pass datetime-like values
    to the on or level keyword.
    
Parameters
----------
closed : {'right', 'left'}
        Which side of bin interval is closed. The default is ‘left’ for all frequency offsets except for ‘M’, ‘A’, ‘Q’, ‘BM’, ‘BA’, ‘BQ’, and ‘W’ which all have a default of ‘right’.
label : {'right', 'left'}
        Which bin edge label to label bucket with. The default is ‘left’ for all frequency offsets except for ‘M’, ‘A’, ‘Q’, ‘BM’, ‘BA’, ‘BQ’, and ‘W’ which all have a default of ‘right’.

第一眼看closed和label這兩個參數继阻,會感覺云里霧里,即使看了例子也可能會覺得莫名奇妙废酷。下面我們通過具體的降采樣和升采樣例子瘟檩,來解讀一下這個兩個參數內含的玄機。

降采樣

首先先來創(chuàng)建一個時間序列澈蟆,起始日期是2018/01/01墨辛,一共12天,每天對應的數值分別是1到12:

rng = pd.date_range('20180101', periods=12)
ts = pd.Series(np.arange(1,13), index=rng)

print(ts)

#### Outputs ####
2018-01-01     1
2018-01-02     2
2018-01-03     3
2018-01-04     4
2018-01-05     5
2018-01-06     6
2018-01-07     7
2018-01-08     8
2018-01-09     9
2018-01-10    10
2018-01-11    11
2018-01-12    12
Freq: D, dtype: int32

下面使用resample方法來做降采樣處理趴俘,頻率是5天睹簇,上面提到的兩個參數,都使用默認值:

ts_5d = ts.resample('5D').sum()
print(ts_5d)

#### Outputs ####
2018-01-01    15
2018-01-06    40
2018-01-11    23
Freq: 5D, dtype: int32

到這里寥闪,我相信不論是代碼還是代碼的結果都很好理解:無非就是每5天來個求和太惠。在第一部分中,我們列出了closed參數的注釋疲憋,從注釋可知凿渊,closed默認的值是'left'。那如果把closed的值改為'right'缚柳,結果有是怎么樣的埃脏?

ts_5d_rightclosed = ts.resample('5D', closed='right').sum()
print(ts_5d_rightclosed)

#### Outputs ####
2017-12-27     1
2018-01-01    20
2018-01-06    45
2018-01-11    12
Freq: 5D, dtype: int32

怎么會這樣?為什么變成了四個區(qū)間秋忙?closed=right到底做了什么彩掐?

別著急,我們來一步一步看看灰追,這其中發(fā)生了什么事情堵幽。原始的時間序列是從18年1月1號到1月12號,一共12天弹澎。以5天為單位降采樣處理后朴下,變成了三個5天,分別是:

  • 第一個5天:1-2-3-4-5-6
  • 第二個5天:6-7-8-9-10-11
  • 第三個5天:12-13-14-15-16

實際上裁奇,這三個5天就是三個區(qū)間了桐猬。和數學里區(qū)間的概念一樣,區(qū)間有開和閉的概念刽肠。在resample中溃肪,區(qū)間的開和閉免胃,就是通過closed這個參數來控制。用數學符號表示的話:

closed = 'left' 左閉右開

上面的三個5天可以由以下的三個左閉右開的區(qū)間構成:

  • 區(qū)間1:[1, 6)
  • 區(qū)間2: [6, 11)
  • 區(qū)間3:[11, 16) 例子中惫撰,時間只到12號為止羔沙,但是這里會往后補足5天

現(xiàn)在,在這三個區(qū)間上做數據聚合也就很好理解了厨钻。對于區(qū)間1進行求和扼雏,也就是12、13夯膀、14诗充、15、16這5天的值求和即可诱建。區(qū)間2和區(qū)間3也是同理蝴蜓。所以下面的代碼就很好理解了:

ts_5d_leftclosed = ts.resample('5D', closed='right').sum()
print(ts_5d_leftclosed)

#### Outputs ####
2018-01-01    15
2018-01-06    40
2018-01-11    23
Freq: 5D, dtype: int32
closed = 'right' 左開右閉

上面的三個5天可以由以下的四個左開右閉的區(qū)間構成。注意俺猿,由于第一個5天是從1號到6號茎匠,但由于是左開區(qū)間,1號就落不到1到6號的那個區(qū)間押袍,所以要往前補足:

  • 區(qū)間1:(27, 1]
  • 區(qū)間2:(1, 6]
  • 區(qū)間3: (6, 11]
  • 區(qū)間4:(11, 16]

現(xiàn)在诵冒,在這四個區(qū)間上做數據聚合也是一樣的道理了:對于區(qū)間1,是對28谊惭,29汽馋,30,31午笛,1這五天的值求和(這里只有1號是有值的)惭蟋,其余的區(qū)間也是同理,但需要注意是左開右閉药磺。所以到這里,上面“莫名其妙”的代碼和結果就好理解了煤伟。復制代碼和結果如下:

ts_5d_rightclosed = ts.resample('5D', closed='right').sum()
print(ts_5d_rightclosed)

#### Outputs ####
2017-12-27     1
2018-01-01    20
2018-01-06    45
2018-01-11    12
Freq: 5D, dtype: int32

理解了clsoed的意義以后癌佩,再來理解label就so easy了。由注釋可知便锨,label的默認值是left围辙。下面在closed='right'的基礎上,將label設置為right:

ts_5d_rightclosed_rightlable = ts.resample('5D', closed='right', label='right').sum()
print(ts_5d_rightclosed_rightlable)

#### Outputs ####
2018-01-01     1
2018-01-06    20
2018-01-11    45
2018-01-16    12
Freq: 5D, dtype: int32

于label為left相比放案,二者結果的異同點如下:

  • 相同點:一樣是四個區(qū)間姚建,每個區(qū)間的聚合的值是一樣的
  • 不同點:每個區(qū)間的索引不同

不難發(fā)現(xiàn),label為left的時候吱殉,就以區(qū)間左邊的那個日期作為索引掸冤;label厘托,就以區(qū)間的右邊那個日期作為索引。

綜上稿湿,我們可以總結一下closed和label的用法和意義了:

  • closed:劃分區(qū)間的依據铅匹,left會劃成左閉右開區(qū)間;right會劃分成左開右閉的區(qū)間饺藤。一般來說包斑,closed為right的時候,區(qū)間會比為left的時候多一個涕俗。區(qū)間劃分完畢罗丰,聚合運算就在這個區(qū)間內執(zhí)行。
  • label:劃分區(qū)間完畢再姑,根據label的不同萌抵,區(qū)間的索引就不同。如果label為left询刹,則區(qū)間左邊的日期作為索引谜嫉;如果label為right,則區(qū)間右邊的日期作為索引凹联。

升采樣

創(chuàng)建一個時間序列沐兰,起始日期是2018/01/01,一共2天蔽挠,每天對應的數值分別是1到2:

rng = pd.date_range('20180101', periods=2)
ts = pd.Series(np.arange(1,2), index=rng)

print(ts)

#### Outputs ####
2018-01-01    1
2018-01-02    2
Freq: D, dtype: int32

升采樣就不涉及到closed和label的值住闯,也就是會忽略(筒子們可以驗證一下),所以我們在使用的時候無需設置這兩個值澳淑。對于升采樣比原,前面也提到,主要是涉及到值的填充杠巡。有下面的四種填充方法(實際是三種):

  • 不填充量窘。那么對應無值的地方,用NaN代替氢拥。對應的方法是asfreq蚌铜。
  • 用前值填充。用前面的值填充無值的地方嫩海。對應的方法是ffill或者pad冬殃。這里方便記憶,ffill的第一個f是代表forward叁怪,向前的意思
  • 用后值填充审葬。對應的方法是bfill,b代表back。

下面是一個例子:

ts_6h_asfreq = ts.resample('6H').asfreq()
print(ts_6h_asfreq)

ts_6h_pad = ts.resample('6H').pad()
print(ts_6h_pad)

ts_6h_ffill = ts.resample('6H').ffill()
print(ts_6h_ffill)

ts_6h_bfill = ts.resample('6H').bfill()
print(ts_6h_bfill)

#### Outputs ####
2018-01-01 00:00:00    1.0
2018-01-01 06:00:00    NaN
2018-01-01 12:00:00    NaN
2018-01-01 18:00:00    NaN
2018-01-02 00:00:00    2.0
Freq: 6H, dtype: float64
2018-01-01 00:00:00    1
2018-01-01 06:00:00    1
2018-01-01 12:00:00    1
2018-01-01 18:00:00    1
2018-01-02 00:00:00    2
Freq: 6H, dtype: int32
2018-01-01 00:00:00    1
2018-01-01 06:00:00    1
2018-01-01 12:00:00    1
2018-01-01 18:00:00    1
2018-01-02 00:00:00    2
Freq: 6H, dtype: int32
2018-01-01 00:00:00    1
2018-01-01 06:00:00    2
2018-01-01 12:00:00    2
2018-01-01 18:00:00    2
2018-01-02 00:00:00    2
Freq: 6H, dtype: int32
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涣觉,一起剝皮案震驚了整個濱河市痴荐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旨枯,老刑警劉巖蹬昌,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攀隔,居然都是意外死亡皂贩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門昆汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來明刷,“玉大人,你說我怎么就攤上這事满粗”材” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵映皆,是天一觀的道長挤聘。 經常有香客問我,道長捅彻,這世上最難降的妖魔是什么组去? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮步淹,結果婚禮上从隆,老公的妹妹穿的比我還像新娘。我一直安慰自己缭裆,他們只是感情好键闺,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澈驼,像睡著了一般辛燥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缝其,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天购桑,我揣著相機與錄音,去河邊找鬼氏淑。 笑死,一個胖子當著我的面吹牛硕噩,可吹牛的內容都是我干的假残。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辉懒!你這毒婦竟也來了阳惹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眶俩,失蹤者是張志新(化名)和其女友劉穎莹汤,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體颠印,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡纲岭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了线罕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片止潮。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钞楼,靈堂內的尸體忽然破棺而出喇闸,到底是詐尸還是另有隱情,我是刑警寧澤询件,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布燃乍,位于F島的核電站,受9級特大地震影響宛琅,放射性物質發(fā)生泄漏刻蟹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一夯秃、第九天 我趴在偏房一處隱蔽的房頂上張望座咆。 院中可真熱鬧,春花似錦仓洼、人聲如沸介陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哺呜。三九已至,卻和暖如春箕戳,著一層夾襖步出監(jiān)牢的瞬間某残,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工陵吸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玻墅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓壮虫,卻偏偏與公主長得像澳厢,于是被迫代替她去往敵國和親环础。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容