Pandas时序数据处理入门
作為一個幾乎每天與時間序列數據打交道的人員,我發現panda?Python包在時間序列的操作和分析方面有強大優勢。
這篇關于panda時間序列數據處理的基本介紹可以帶你入門時間序列分析。本文將主要介紹以下操作:
- 創建一個日期范圍
- 處理時間戳數據
- 將字符串數據轉換為時間戳
- 在數據框中索引和切片時間序列數據
- 重新采樣不同時間段的時間序列匯總/匯總統計數據
- 計算滾動統計數據,如滾動平均值
- 處理丟失數據
- 了解unix/epoch時間的基礎知識
- 了解時間序列數據分析的常見陷阱
接下來我們一起步入正題。如果想要處理已有的實際數據,你可能考慮從使用panda read_csv將文件讀入數據框開始,然而在這里,我們將直接從處理生成的數據開始。
首先導入我們將會使用到的庫,然后用它們創建日期范圍
import pandas as pd from datetime import datetime import numpy as npdate_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')這個日期范圍的時間戳為每小時一次。如果我們調用date_rng,我們會看到如下所示:
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq='H')我們可以檢查第一個元素的類型:
type(date_rng[0]) #returns pandas._libs.tslib.Timestamp讓我們用時間戳數據的創建一個示例數據框,并查看前15個元素:
df = pd.DataFrame(date_rng, columns=['date']) df['data'] = np.random.randint(0,100,size=(len(date_rng))) df.head(15)如果想進行時間序列操作,我們需要一個日期時間索引。這樣一來,數據框便可以在時間戳上建立索引。
將數據框索引轉換為datetime索引,然后顯示第一個元素:
df['datetime'] = pd.to_datetime(df['date']) df = df.set_index('datetime') df.drop(['date'], axis=1, inplace=True) df.head()如果數據中的“時間”戳實際上是字符串類型和數值類型相比較,該怎么辦呢?我們可以將date_rng轉換為字符串列表,然后將字符串轉換為時間戳。
string_date_rng = [str(x) for x in date_rng] string_date_rng #returns ['2018-01-01 00:00:00','2018-01-01 01:00:00','2018-01-01 02:00:00','2018-01-01 03:00:00','2018-01-01 04:00:00','2018-01-01 05:00:00','2018-01-01 06:00:00','2018-01-01 07:00:00','2018-01-01 08:00:00','2018-01-01 09:00:00',...可以通過推斷字符串的格式將其轉換為時間戳,然后查看這些值:
timestamp_date_rng = pd.to_datetime(string_date_rng, infer_datetime_format=True) timestamp_date_rng #returns DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq=None)但是如果需要轉換一個唯一的字符串格式呢?
我們可以創建一個任意的字符串形式的日期列表,并將它們轉換為時間戳:
string_date_rng_2 = ['June-01-2018', 'June-02-2018', 'June-03-2018'] timestamp_date_rng_2 = [datetime.strptime(x,'%B-%d-%Y') for x in string_date_rng_2] timestamp_date_rng_2 #returns [datetime.datetime(2018, 6, 1, 0, 0),datetime.datetime(2018, 6, 2, 0, 0),datetime.datetime(2018, 6, 3, 0, 0)]如果把它放到數據框中,將會如何?
df2 = pd.DataFrame(timestamp_date_rng_2, columns=['date']) df2回到最初的數據框架,讓我們通過解析時間戳索引來查看數據:
假設只想查看本月2號的數據,可以使用如下索引。
df[df.index.day == 2]頂部如圖所示:
也可以通過數據框索引直接調用想查看的日期:
df['2018-01-03']如何在特定日期之間選擇數據?
df['2018-01-04':'2018-01-06']我們填充的基本數據框提供了頻率以小時計的數據,但同樣可以以不同的頻率重新采樣數據,并指定如何計算新樣本頻率的匯總統計信息。我們可以取每天頻率下數據的最小值、最大值、平均值、總和等,而不是每小時的頻率,如下面的例子,計算每天數據的平均值:
df.resample('D').mean()那么諸如滾動平均值或滾動和之類的窗口統計信息呢?
讓我們在原來的df中創建一個新列,計算3個窗口周期內的滾動和,然后查看數據框的頂部:
df ['rolling_sum'] = df.rolling(3).sum() df.head(10)可以看到,在這個正確的計算中,只有當存在三個周期可以回顧時,它才開始具有有效值。
這可以有效地幫我們了解到,當處理丟失的數據值時,如何向前或向后“滾動”數據。
這是我們的df,但有一個新的列,采取滾動求和并向后“滾動”數據:
df['rolling_sum'] = df.rolling(3).sum() df.head(10)采用諸如平均時間之類的實際值用于填補丟失的數據,這種方法通常來說是有效的。但一定謹記,如果你正處理一個時間序列的問題,并且希望數據是切合實際的,那么你不應該向后“滾動”數據。因為這樣一來,你需要的關于未來的信息就永遠不可能在那個時間獲取到。你可能更希望頻繁地向前“滾動”數據,而不是向后“滾動”。
在處理時間序列數據時,可能會遇到Unix時間中的時間值。Unix時間,也稱為Epoch時間,是自協調世界時(UTC) 1970年1月1日星期四00:00:00以后經過的秒數。使用Unix時間有助于消除時間戳的歧義,這樣我們就不會被時區、夏令時等混淆。
下面是一個時間t在Epoch時間的例子,它將Unix/Epoch時間轉換為UTC中的常規時間戳:
epoch_t = 1529272655 real_t = pd.to_datetime(epoch_t, unit='s') real_t #returns Timestamp('2018-06-17 21:57:35')如果我想把UTC中的時間轉換為自己的時區,可以簡單地做以下操作:
real_t.tz_localize('UTC').tz_convert('US/Pacific') #returns Timestamp('2018-06-17 14:57:35-0700', tz='US/Pacific')掌握了這些基礎知識后,就可以開始處理時間序列數據了。
以下是一些處理時間序列數據時要記住的技巧和常見的陷阱:
- 檢查數據中可能由區域特定時間變化(如夏令時)引起的差異。
- 精心跟蹤時區?- 讓他人通過代碼了解你的數據所在的時區,并考慮轉換為UTC或標準化值以保持數據標準化。
- 丟失的數據可能經常發生 - 請確保記錄清潔規則并考慮不回填在采樣時無法獲得的信息。
- 請記住,當重新采樣數據或填寫缺失值時,將丟失有關原始數據集的一定數量的信息。建議跟蹤所有數據轉換并跟蹤數據問題根源。
- 重新采樣數據時,最佳方法(平均值,最小值,最大值,總和等)取決于擁有的數據類型以及采樣方式。請仔細考慮如何重新采樣數據以進行分析。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Pandas时序数据处理入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NoSQL最新现状和趋势:云NoSQL数
- 下一篇: 阿里敏捷教练:多团队开发一个产品的组织设