Pandas時序數據處理入門

做爲一個幾乎天天與時間序列數據打交道的人員,我發現panda Python包在時間序列的操做和分析方面有強大優點。html

這篇關於panda時間序列數據處理的基本介紹能夠帶你入門時間序列分析。本文將主要介紹如下操做:api

  • 建立一個日期範圍
  • 處理時間戳數據
  • 將字符串數據轉換爲時間戳
  • 在數據框中索引和切片時間序列數據
  • 從新採樣不一樣時間段的時間序列彙總/彙總統計數據
  • 計算滾動統計數據,如滾動平均值
  • 處理丟失數據
  • 瞭解unix/epoch時間的基礎知識
  • 瞭解時間序列數據分析的常見陷阱

接下來咱們一塊兒步入正題。若是想要處理已有的實際數據,你可能考慮從使用panda read_csv將文件讀入數據框開始,然而在這裏,咱們將直接從處理生成的數據開始。框架

首先導入咱們將會使用到的庫,而後用它們建立日期範圍dom

import pandas as pd
from datetime import datetime
import numpy as np

date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')

這個日期範圍的時間戳爲每小時一次。若是咱們調用date_rng,咱們會看到以下所示:3d

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')

咱們能夠檢查第一個元素的類型:unix

type(date_rng[0])
#returns
pandas._libs.tslib.Timestamp

讓咱們用時間戳數據的建立一個示例數據框,並查看前15個元素:code

df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
df.head(15)

若是想進行時間序列操做,咱們須要一個日期時間索引。這樣一來,數據框即可以在時間戳上創建索引。orm

將數據框索引轉換爲datetime索引,而後顯示第一個元素:htm

df['datetime'] = pd.to_datetime(df['date'])
df = df.set_index('datetime')
df.drop(['date'], axis=1, inplace=True)
df.head()

若是數據中的「時間」戳其實是字符串類型和數值類型相比較,該怎麼辦呢?咱們能夠將date_rng轉換爲字符串列表,而後將字符串轉換爲時間戳。blog

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或標準化值以保持數據標準化。
  • 丟失的數據可能常常發生 - 請確保記錄清潔規則並考慮不回填在採樣時沒法得到的信息。
  • 請記住,當從新採樣數據或填寫缺失值時,將丟失有關原始數據集的必定數量的信息。建議跟蹤全部數據轉換並跟蹤數據問題根源。
  • 從新採樣數據時,最佳方法(平均值,最小值,最大值,總和等)取決於擁有的數據類型以及採樣方式。請仔細考慮如何從新採樣數據以進行分析。


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索