日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python】ime series:时间序列

發布時間:2025/3/21 python 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】ime series:时间序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
time series:時間序列

目錄:

文章目錄

    • @[toc]
      • 一 時間序列總覽
      • 二 日期和時間數據類型及工具
        • 1 日期和時間數據類型
        • 2 字符串和datetime的相互轉換
      • 三 時間序列基礎
        • 1 索引、選取、子集構造
        • 2 帶有重復索引的時間序列
      • 四 日期的范圍、頻率及移動
        • 1 生成日期范圍
        • 2 頻率和日期偏移量
        • 3 移動(超前和滯后)數據
      • 五 時區處理
        • 1 本地化和轉換
        • 2 操作時區意識型Timestamp對象
        • 3 不同時區之間的運算
      • 六 時期及其算術運算
        • 1 時期的頻率轉換
        • 2 按季度計算的時期頻率
        • 3 將Timestamp轉換為Period(及其反向過程)
        • 4 通過數組創建PeriodIndex
      • 七 重采樣及頻率轉換
        • 1 降采樣
        • 2 升采樣和插值
        • 3 通過時期進行重采樣
      • 八 時間序列繪圖
      • 九 移動窗口函數
        • 1 指數加權函數
        • 2 二元移動函數
        • 3 用戶自定義的移動窗口函數

一 時間序列總覽

  • 不管在哪個領域(金融學、經濟學、生態學、神經科學、物理學等),時間序列(time series)數據都是一種重要的結構化數據形式。在多個時間點觀察或測量到的任何事物都可以形成一段時間序列。很多時間序列都是固定頻率的,基本數據點都是根據某種規律出現的;時間序列也可以是不定期的額。時間序列數據的意義取決于具體的應用場景,主要有以下幾種:
    • ① 時間戳(timestamp):特定的時刻
    • ② 固定時期(period):如2007年1月或2014年全年
    • ③ 時間間隔(interval):由起始和結束時間戳表示。時期可以被看做間隔的特例。
    • ④ 實驗過程時間,每個時間點都是相對于特定起始時間的一個度量。
  • 許多技術都可以用來處理實驗型時間序列,其索引可能是一個整數或浮點數(表示從實驗開始算起已經過去的時間)。最簡單也最常見的時間序列都是用時間 戳進行索引的。
  • pandas提供了一組標準的時間序列處理工具和數據算法。可以高效處理非常大的時間序列,輕松進行切片/切塊、聚合、對定期、不定期的時間序列進行重采樣等。這些工具大部分都對金融和經濟數據尤為重要,也可以用來分析服務器日志數據。

二 日期和時間數據類型及工具

1 日期和時間數據類型

  • python標準庫包含用于日期(date)和時間(time)數據的數據類型,而且還有日歷方面的功能。主要用到datetime、time以及calendar模塊。datetime.datetime是用得最多的數據類型。
from datetime import datetime now = datetiem.now() now.year,now.month,now.day
  • datetime以毫秒形式存儲日期和時間,datetime.timedelta表示連個datetime對象之間的時間差
delta = datetime(2011,1,4) - datetime(2008,9,8,8,15)
  • 可以給datetime對象加上或減去一個或多個timedelta,這樣會產生一個新對象。
  • datetime時間模塊數據類型:
    • date #以公歷形式存儲的日歷日期
    • time # 將時間存儲為時、分、秒、毫秒
    • datetime # 存儲日期和時間
    • timedelta # 表示兩個datetime值之間的差

2 字符串和datetime的相互轉換

  • 利用str或strtfime方法(傳入一個格式化字符串),datetime對象和pandas的Timestamp對象可以被格式化為字符串。
stamp = datetime(2011,1,3) stamp.strftime('%y-%m-%d')
  • datetime格式定義:
    • %Y 4位數的年
    • %y 2位數的年
    • %m 2位數的月
    • %d 2位數的日
    • %H 24小時制的時
    • %I 12小時制的時
    • %M 2位數的分
    • %S 秒
    • %w 用整數表示的星期幾[0(星期天),6]
    • %U 每年的第幾周(00,53)。星期天被認為是每周的第一天,每年第一個星期天之前得那幾天被認為是第“0周”
    • %W 每年的第幾周(00,53)。星期一被認為是每周的第一天,每年第一個星期一之前得那幾天被認為是第“0周”
    • %z 時區偏移量
    • %F %Y-%m-%d簡寫形式,例如2012-4-18
    • %D %m-%d-%y簡寫形式,例如04/18/12
  • strptime也可以用這些格式化編碼將字符串轉換為日期。datetime.strptime是通過已知格式進行日期解析的最佳方式。但是每次都要編寫格式定義是很麻煩的事情,尤其是對于一些常見的日期格式。這種情況下,可以用dateutil這個第三方包中的parser.parse方法,dateutil可以解析幾乎所有人類能夠理解的日期表示形式。
  • 在國際通用的格式中,日通常出現在月的前面,傳入dayfirst = True即可
  • pandas通常用來處理成組日期,還可以處理缺失值。
  • datetime對象還有一些特定于當前環境的格式化選項。

三 時間序列基礎

  • pandas最基本的時間序列類型就是以時間戳(通常以python字符串或datetime對象表示)為索引的Series。這些datetime對象實際上被放在一個datetimieIndex中
  • 跟其他Series一樣,不同索引的時間序列之間的算術運算會自動按日期對齊
  • pandas用Numpy的datetime64數據類型以納秒形式存儲時間戳。

1 索引、選取、子集構造

  • 由于TimeStamp是Series的一個子類,所以在索引以及數據選取方面它們的行為是一樣的。
  • 有一種更為簡便的用法:直接傳入一個可以被解釋為日期的字符串。
  • 對于較長的時間序列,只需傳入“年”或“年月”即可輕松選取數據的切片。
  • 通過日期進行切片的方式只對規則Series有效。
  • 由于大部分時間序列數據都是按照時間先后排序的,因此也可以用不存在于該時間序列中的時間戳對齊進行切片(即范圍查詢)。此外,還有兩個等價的實例方法可以截取兩個日期之間的TimeSeries,after = ‘1/9/2011’,before。
  • 這些操作對DataFrame也有效。

2 帶有重復索引的時間序列

  • 在某些應用場景中,可能會存在多個觀測數據落在同一個時間點上的情況,通過檢查索引的is_unique屬性,可以知道是否唯一。
  • 想要對具有唯一時間戳的數據進行聚合,一個辦法是使用groupby,并傳入level = 0(索引的唯一一層)。

四 日期的范圍、頻率及移動

  • pandas中的時間序列一般被認為是不規則的,也就是說,沒有固定的頻率。對于大部分應用程序而言,這是無所謂的。但是,它常常需要以某種相對固定的頻率進行分析,比如每日、每月、每15分鐘(這樣自然會在時間序列中引入缺失值)、幸運的是pandas有一整套標準時間序列頻率以及用于重采樣、頻率推斷、生成固定頻率日期范圍的工具。例如:將一個時間序列轉換為一個具有固定頻率的時間序列,只需調用resample即可。

1 生成日期范圍

  • pandas.date_range可用于生成指定長度的DatetimeIndex
index = pd.date_range('4/1/2012','6/1/2012')
  • 默認情況下,date_range會產生按天計算的時間點。如果只傳入起始或者結束日期,就還得傳入一個表示一段時間的數字。
pd.date_range('4/1/2012','6/1/2012',periods = 20)
  • 起始和結束日期定義了日期索引的嚴格邊界。例如:如果想要生成一個由每月最后一個工作日組成的日期索引,可以傳入“BM”頻率,這樣就只會包含時間間隔內(或剛好在邊界上)符合頻率要求的日期。
pd.date_range('4/1/2012','6/1/2012',freq = 'BM')
  • date_range默認會保留起始和結束時間戳的時間信息(如果有的話)。
  • 有時,雖然起始和結束日期帶有時間信息,但希望產生一組被規范化到午夜的時間戳。normalize可以實現該功能。
pd.date_range('5/2/2012 12:56:31' ,periods = 5,normalize = True)

2 頻率和日期偏移量

  • pandas中的頻率是由一個基礎頻率(base frequency)和一個乘數組成。基礎頻率通常以一個字符串別名組成,比如‘M’表示每月,“H”表示每時。對于每一個基礎頻率,都有一個唄成為日期偏移量(date offset)的對象與之對應。
from pandas.tseries.offset import Hour,Minute hour = Hour() hour = Hour(4) # 傳入一個整數即可定義偏移量的倍數
  • 一般來說,無需顯示創建這樣的對象,只需使用諸如“H”或“4H”這樣的字符串別名即可。在基礎頻率前面放一個整數即可創建倍數。
  • 大部分偏移量都可以通過加法連接。
  • 同理,也可以傳入頻率字符串(如:2h30min),這種頻率可以被高效地解析為等效表達式。
pd.date_range('1/1/2012',periods = 20,freq = '1h30min')
  • 有些頻率所描述的時間點并不是均勻分隔的。錨點偏移量。
  • 時間序列的基礎頻率:
    • D # day 每日歷日
    • B # businessday 每工作日
    • H # hour 每小時
    • T或min # minute 每分鐘
    • S # second 每秒
    • L或ms # milli 每毫秒
    • U # 每微妙
    • M # 每月最后一個日歷日
    • BM # 每月最后一個工作日
    • MS # 每月第一個日歷日
    • BMS # 每月第一個工作日
    • W-MON/W-TUE… # 從指定的星期幾開始算起、每周
    • WOM-1MON… # 產生每月第一個、二、三個星期幾
    • Q-JAN/Q-FEB… # 對于以指定月份結束的年度,每季度最后一月的最后一個 日歷日
    • BQ-JAN # 對于以指定月份結束的年度,每季度最后一月的最后一個 工作日
    • QS-JAN# 對于以指定月份結束的年度,每季度最后一月的第一個 日歷日
    • BQS-JAN# 對于以指定月份結束的年度,每季度最后一月的第一個 日歷日
    • A-JAN # 每年指定月份的最后一個日歷日
    • BA-JAN # 每年指定月份的最后一個工作日
    • AS-JAN # 每年指定月份的第一個日歷日
    • BAS-JAN # 每年指定月份的第一個工作日

3 移動(超前和滯后)數據

  • 移動(shifting)指的是沿著時間軸將數據前移或后移。
  • shift同行用于計算一個時間序列或多個時間序列中的百分比變化
  • 通過偏移量對日期進行位移。

五 時區處理

1 本地化和轉換

2 操作時區意識型Timestamp對象

3 不同時區之間的運算


六 時期及其算術運算

1 時期的頻率轉換

2 按季度計算的時期頻率

3 將Timestamp轉換為Period(及其反向過程)

4 通過數組創建PeriodIndex


七 重采樣及頻率轉換

  • 重采樣指的是將時間序列從一個頻率轉換到另一個頻率的處理過程。將高頻率數據聚合到低頻率成為降采樣,而將低頻率數據轉換到高頻率則成為升采樣。
  • pandas對象都帶有一個resample方法,它是各種頻率轉換工作的主力函數。
  • resample方法的參數:
    • freq # 表示重采樣頻率的字符串或DateOffset
    • how = ‘mean’ # 用于產生聚合值的函數名或數組函數
    • axis = 0 # 重采樣的軸
    • fill_method = None # 升采樣時如何插值
    • closed = ‘right’ # 在降采樣中,各時間段的哪一段是閉合的
    • label = ‘right’# 在降采樣中,如何設置聚合值的標簽
    • loffset = None # 面元標簽的時間校正值
    • limit = None # 在前向或后向填充時,允許填充的最大時期數
    • kind = None # 聚合到時期或時間戳,默認聚合到時間序列的索引類型
    • convention = None # 當重采樣時期時,將低頻率轉換到高頻率所采用的約定

1 降采樣

  • 將數據聚合到規整的低頻率是一件非常普通的額時間序列處理任務。待聚合的數據不必擁有固定的頻率,期望的頻率會自動定義聚合的面元邊界,這些面元用于將時間序列拆分為多個片段。
  • 用resample對數據進行降采樣時,需要考慮兩樣東西:
    • 各區間哪邊是閉合的
    • 如何標記各個聚合面元,用區間的開頭還是結尾
rng = pd.date_range('1/1/2012',periods = 12,freq = 'T') ts = Series(np.range(12),index = rng) ts.resample('5min',how = 'sum') ts.resample('5min',how = 'sum',closed = 'left') # 傳入label = 'left'即可用面元的左邊界進行標記 ts.resample('5min',how = 'sum',loffset = '-1s') # 通過loffset設置一個字符串或日期偏移量即可實現從右邊界或左邊界減去或加上一個時間以便更明白該時間戳到底表示的是哪個區間。
  • 另一種降采樣的方法是pandas的groupby功能。

2 升采樣和插值

  • 將數據從低頻率轉換到高頻率時,就不需要聚合了,會引入缺失值,需要用到fillna和reindex

3 通過時期進行重采樣

  • 對采用時期索引的數據進行重采樣是件非常簡單的事情。升采樣要稍微麻煩點,必須決定在新頻率中各區間的哪段用于放置原來的值。
  • 由于時期指的是時間區間,所以升采樣和降采樣的規則比較嚴格:
    • ① 在降采樣中,目標頻率必須是源頻率的子時期
    • ② 在升采樣中,目標頻率必須是源頻率的超時期
  • 如果不滿足這些條件,就會引發異常。

八 時間序列繪圖

  • 當對DataFrame調用plot時,所有時間序列都被繪制在一個subplot上,并有一個圖例說明哪個是哪個。
  • pandas時間序列在繪圖方面還有一個特點,當右鍵點擊并拖拉(放大、縮小)時,日期會動態展開或收縮,且繪圖窗口中的時間區間會被重新格式化。當然,只有在交互模式下使用matplotlib才會有此效果。

九 移動窗口函數

  • 在移動窗口(可以帶有指數衰減權數)上計算的各種統計函數也是一類常見于時間序列的數組變換。成為移動窗口函數,其中還包括那些窗口不定長的函數(如指數加權移動平均)。跟其他函數一樣,移動窗口函數也會自動排除缺失值。
    • 諸如rolling_meaning 這樣的函數需要指定數量的非NA觀測值。可以修改該行為以解決缺失數據的問題。
    • 要計算擴展窗口平均,可以將擴展窗口看做一個特殊的窗口,其長度與時間序列一樣,但只需一期即可計算一個值。
    • 對DataFrame調用rolling_mean會將轉換應用到所有的列上。
  • 移動窗口和指數加權函數
    • rolling _count
    • rolling_sum
    • rolling_mean
    • rolling_median
    • rolling_var/rolling_std
    • rolling_skew/rolling_kurt
    • rolling_min/rolling_max
    • rolling_quantile
    • rolling_corr/rolling_cov
    • rolling_apply
    • ewma
    • ewmvar/ewmstd
    • ewmcorr/ewmcov

1 指數加權函數

  • 另一種使用固定大小窗口及相等數觀測值的辦法是,定義一個衰減因子常量,以便使近期的觀測值擁有更大的權數。
  • 由于指數加權統計會賦予近期的觀測值更大的權數,因此相對于等權統計,它能適應更快的變化。

2 二元移動函數

  • 有些統計運算(如相關系數與協方差)需要在兩個以上的時間序列上執行。
  • 假設需要一次性計算多只股票的標準普爾500指數的相關系數。只需要傳入一個TimeSeries和一個DataFrame,rolling_corr就會自動計算TimeSeries與DataFrame各列的額相關系數。

3 用戶自定義的移動窗口函數

  • rolling_apply函數使用戶能夠在移動窗口上應用自己設計的數組函數。唯一要求就是:該函數要能從數組的各個片段中產生單個值(即簡約)。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【Python】ime series:时间序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。