<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          pandas時間序列常用方法簡介

          共 3605字,需瀏覽 8分鐘

           ·

          2020-08-10 16:16


          導讀

          pandas是Python數(shù)據(jù)分析最好用的第三方庫,沒有之一。——笛卡兒沒說過這句話!


          在進行時間相關的數(shù)據(jù)分析時,時間序列的處理是自然而然的事情,從創(chuàng)建、格式轉(zhuǎn)換到篩選、重采樣和聚合統(tǒng)計,pandas都提供了全套方法支持,用的熟練簡直是異常絲滑。




          01 創(chuàng)建

          pandas時間序列創(chuàng)建最為常用的有以下2種方式:

          • pd.date_range(),創(chuàng)建指定日期范圍,start、end和periods三個參數(shù)任意指定2個即可,另有頻率、開閉端點、時區(qū)等參數(shù)可選

          • pd.Timestamp(),時間戳對象,從其首字母大寫的命名方式可以看出這是pandas中的一個類,實際上相當于Python標準庫中的datetime的定位,在創(chuàng)建時間對象時可接受日期字符串、時間戳數(shù)值或分別指定年月日時分秒等參數(shù)三類,僅能生成單一時間點。其優(yōu)點是Timestamp類提供了豐富的時間處理接口,如日期加減、屬性提取等



          與二者類似,pandas還提供了pd.period和pd.period_range兩個方法,分別用于創(chuàng)建單個時期和時期序列。這里時期是一段時間,而date或timestamp則是一個時間點。

          02 轉(zhuǎn)換

          實際應用中,與時間格式相互轉(zhuǎn)換最多的應該就是字符串格式了,這也是最為常用也最為經(jīng)典的時間轉(zhuǎn)換需求,pandas中自然也帶有這一功能:

          • pd.to_datetime:字符串轉(zhuǎn)時間格式

          • dt.astype(str):時間提取字符串


          其中,pd.to_datetime可接受單個或多個日期數(shù)值,具體類型包括數(shù)值型、字符串、數(shù)組或pd.series等序列,其中字符串日期格式幾乎包含了所有可能的組成形式,例如"年/月/日","月/日/年"和"月-日-年"等形式,字符串轉(zhuǎn)換日期也是實際應用中最為常見的需求。反之,對于日期格式轉(zhuǎn)換為相應的字符串形式,pandas則提供了時間格式的"dt"屬性,類似于pandas為字符串類型提供了str屬性及相應方法,時間格式的"dt"屬性也支持大量豐富的接口。例如dt.date可提取日期,dt.time則可提取時間。

          需要指出,時間序列在pandas.dataframe數(shù)據(jù)結(jié)構(gòu)中,當該時間序列是索引時,則可直接調(diào)用相應的屬性;若該時間序列是dataframe中的一列時,則需先調(diào)用dt屬性再調(diào)用接口。舉例如下:


          1.首先創(chuàng)建數(shù)據(jù)結(jié)構(gòu)如下,其中初始dataframe索引是時間序列,兩列數(shù)據(jù)分別為數(shù)值型和字符串型


          2.運用to_datetime將B列字符串格式轉(zhuǎn)換為時間序列


          3.分別訪問索引序列中的時間和B列中的日期,并輸出字符串格式


          03 篩選

          處理時間序列的另一個常用需求是篩選指定范圍的數(shù)據(jù),例如選取特定時段、特定日期等。實現(xiàn)這一目的,個人較為常用的有3種方法:

          • 索引模糊匹配,這實際上算是pandas索引訪問的一個通用策略,所以自然在時間篩選中也適用

          • truncate,截斷函數(shù),通過接受before和after參數(shù),實現(xiàn)篩選特定范圍內(nèi)的數(shù)據(jù),其中兩個參數(shù)中可有一個缺省,表示半開區(qū)間

          • dt.between,也是借助時間序列的dt屬性,接受起始和結(jié)束參數(shù),實現(xiàn)特定范圍篩選



          以這一數(shù)據(jù)作為示例,其中索引時間序列,需求是篩選出上午7點-9點間的記錄,則3種實現(xiàn)方式分別示例如下:


          1.通過索引模糊匹配,由于是要查詢7點-9點間的記錄,這等價于通過行索引查詢以07到08開頭之間的數(shù)據(jù),查詢結(jié)果如下:


          實際上,這是pandas行索引訪問的通用策略,即模糊匹配。當然,雖然同樣是執(zhí)行的模糊匹配,但對于時間序列和字符串序列的匹配策略還是略有不同:時間序列執(zhí)行的模糊匹配是"截斷式",即只要當前匹配,則進行篩選保留;而字符串序列執(zhí)行的模糊匹配是"比較式",也就是說在執(zhí)行范圍查詢時實際上是將各索引逐一與查詢范圍進行比較字符串大小,若滿足區(qū)間則篩選保留。這里補充一個將時間序列索引轉(zhuǎn)化為字符串格式的普通索引后的模糊匹配例子,可自行體會下二者的區(qū)別:


          2.truncate截斷函數(shù),實際上這也不是一個時間序列的專用方法,而僅僅是pandas中布爾索引的一種簡略寫法:通過逐一將索引與起始值比較得出布爾值,從而完成篩選。例如,仍然查詢7點-9點間的記錄,得到以下結(jié)果:


          3.dt.between,這是一個真正意義上的時間序列篩選方法,通過訪問dt屬性,并指定起止時間,從而完成指定時間范圍的記錄篩選。其具體用法有些類似SQL中的between。需注意的是該方法主要用于數(shù)據(jù)列的時間篩選,其最大優(yōu)勢在于可指定時間屬性比較,例如可以指定time字段根據(jù)時間篩選而不考慮日期范圍,也可以指定日期范圍而不考慮時間取值,這在有些場景下是非常實用的。



          04 重采樣
          重采樣是pandas時間序列中的一個特色操作,在有些連續(xù)時間記錄需要按某一指定周期進行聚合統(tǒng)計時尤為有效,實現(xiàn)這一功能的函數(shù)主要是resample。這里resample意為重采樣,具體又包括上采樣和下采樣:前者也叫升采樣,意為著采樣后頻率升高,如從2小時一個周期變?yōu)?小時一個周期;而后者也叫降采樣,采樣后頻率降低,如從1小時變?yōu)?小時采樣。仍然以前述的時間索引記錄為例,首先將其按4小時為周期進行采樣,此時在每個4小時周期內(nèi)的所有記錄匯聚為一條結(jié)果,所以自然涉及到聚合函數(shù)的問題,包括計數(shù)、求均值、累和等等。


          在完成4小時降采樣的基礎上,如果此時需要周期為2小時的采樣結(jié)果,則就是上采樣。直觀來看,由于此時是將6條記錄結(jié)果上升為12條記錄結(jié)果,而這些數(shù)據(jù)不會憑空出現(xiàn),所以如果說下采樣需要聚合、上采樣則需要空值填充,常用方法包括前向填充、后向填充等。這里我們結(jié)合業(yè)務實際,采取前向填充的方式,得到2小時采樣結(jié)果如下:


          關于pandas時間序列的重采樣,再補充兩點:1.重采樣函數(shù)可以和groupby分組聚合函數(shù)組合使用,可實現(xiàn)更為精細的功能,具體可參考Pandas中g(shù)roupby的這些用法你都知道嗎一文;2.重采樣過程中,無論是上采樣還是下采樣,其采樣結(jié)果范圍是輸入記錄中的最小值和最大值覆蓋的范圍,所以當輸入序列中為兩段不連續(xù)的時間序列記錄時,可能會出現(xiàn)中間大量不需要的結(jié)果(筆者親歷天坑),同時在上圖中也可發(fā)現(xiàn)從4小時上采樣為2小時后時間最大范圍是20:00,而非22:00,也是這個原因。


          05 滑動窗口

          理解pandas中時間序列滑動窗口的最好方式是類比SQL中的窗口函數(shù)。實際上,其與分組聚合函數(shù)的聯(lián)系和SQL中的窗口函數(shù)與分組聚合聯(lián)系是一致的。常用的滑動窗口函數(shù)主要有3個:

          • shift,向前或向后取值

          • diff,向前或向后去差值

          • rolling,一段滑動窗口內(nèi)聚合取值


          仍以前述時間序列數(shù)據(jù)為例,為了便于比較,首先再次給出數(shù)據(jù)序列


          1.shift完成向前或向后滑動取值,periods參數(shù)設置滑動長度,freq設置滑動參考周期,默認為空,此時僅僅是向后讀取一條記錄


          設置freq=10T,向后滑動10分鐘后取值。


          值得指出,這里的滑動取值可以這樣理解:periods參數(shù)為正數(shù)時,可以想象成索引列不動,數(shù)據(jù)列向后滑動;反之,periods參數(shù)為負數(shù)時,索引列不動,數(shù)據(jù)列向前滑動。進一步的,當freq參數(shù)為None時,則僅僅是滑動指定數(shù)目的記錄,而不管索引實際取值;而當freq設置有效參數(shù)時,此時要求索引列必須為時間序列,并根據(jù)時間序列滑動到指定周期處,并從此處開始取值(在上圖中,體現(xiàn)為10T之前的記錄不再保留)。


          2.在理解shift操作的基礎上,diff函數(shù)用于取差值就容易得多,且比其更為簡單的是diff操作只支持記錄間的差值,而不支持指定周期。接受參數(shù)主要是periods:當其為正數(shù)時,表示當前值與前面的值相減的結(jié)果;反之,當其未負數(shù)時,表示當前值與后面的值相減。


          以差值窗口長度=1為例,實際上此時只是簡單的執(zhí)行當前值與其前一個值的差,其應用shift的等價形式即為:


          3.rolling,這是一個原原本本的滑動窗口,適用場景是連續(xù)求解一段時間內(nèi)的某一指標。例如,求解連續(xù)3條記錄的均值,則可簡單實現(xiàn)如下:


          注意到由于窗口長度設置為3,前兩條記錄因為"向前湊不齊"3條,所以結(jié)果為空值。當然,就這一特定需求而言,也可由shift函數(shù)實現(xiàn):




          相關閱讀:


          瀏覽 122
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷av | 无码性爱视频在线观看 | 淫色大吊人妖乱伦视频 | 青草视频欧美 | 久久艹久久|