時間序列數據有許多定義,它們以不同的方式表示相同的含義。一個簡單的定義是時間序列數據包括附加到順序時間點的數據點。
時間序列數據的來源是周期性的測量或觀測。許多行業都存在時間序列數據。舉幾個例子:
一段時間內的股票價格每天,每周,每月的銷售額流程中的周期性度量一段時間內的電力或天然氣消耗率在這篇文章中,我將列出20個要點,幫助你全面理解如何用Pandas處理時間序列數據。
1.不同形式的時間序列數據
時間序列數據可以是特定日期、持續時間或固定的自定義間隔的形式。
時間戳可以是給定日期的一天或一秒,具體取決於精度。例如,' 2020-01-01 14:59:30 '是基於秒的時間戳。
2.時間序列數據結構
Pandas提供靈活和高效的數據結構來處理各種時間序列數據。
除了這3個結構之外,Pandas還支持日期偏移概念,這是一個與日曆算法相關的相對時間持續時間。
3.創建一個時間戳
最基本的時間序列數據結構是時間戳,可以使用to_datetime或Timestamp函數創建
import pandas as pdpd.to_datetime('2020-9-13')Timestamp('2020-09-13 00:00:00')pd.Timestamp('2020-9-13')Timestamp('2020-09-13 00:00:00')
4.訪問按時間戳保存的信息
我們可以獲得存儲在時間戳中的關於日、月和年的信息。
a = pd.Timestamp('2020-9-13')a.day_name()'Sunday'a.month_name()'September'a.day13a.month9a.year2020
5. 隱藏信息訪問
時間戳對象還保存有關日期算法的信息。例如,我們可以問這一年是不是閏年。以下是我們可以獲得的一些更具體的信息:
b = pd.Timestamp('2020-9-30')b.is_month_endTrueb.is_leap_yearTrueb.is_quarter_startFalseb.weekofyear40
6. 歐洲風格的日期
我們可以使用to_datetime函數處理歐洲風格的日期(即日期在先)。dayfirst參數被設置為True。
pd.to_datetime('10-9-2020', dayfirst=True)Timestamp('2020-09-10 00:00:00')pd.to_datetime('10-9-2020')Timestamp('2020-10-09 00:00:00')
注意:如果第一項大於12,Pandas會知道它不能是月。
pd.to_datetime('13-9-2020')Timestamp('2020-09-13 00:00:00')
7. 將數據格式轉換為時間序列數據
to_datetime函數可以將具有適當列的數據名稱轉換為時間序列。考慮以下數據格式:
pd.to_datetime(df)0 2020-04-13 1 2020-05-16 2 2019-04-11 dtype: datetime64[ns]
7.時間戳之外的時間表示
在現實生活中,我們幾乎總是使用連續的時間序列數據,而不是單獨的日期。而且,Pandas處理順序時間序列數據非常簡單。
我們可以將日期列表傳遞給to_datetime函數。
pd.to_datetime(['2020-09-13', '2020-08-12', '2020-08-04', '2020-09-05'])DatetimeIndex(['2020-09-13', '2020-08-12', '2020-08-04', '2020-09-05'], dtype='datetime64[ns]', freq=None)
返回的對象是一個DatetimeIndex。
還有一些更實用的方法來創造一系列的時間數據。
9. 用todatetime和totimedelta創建時間序列
可以通過將TimedeltaIndex添加到時間戳中來創建DatetimeIndex。
pd.to_datetime('10-9-2020') + pd.to_timedelta(np.arange(5), 'D')
「D」用來表示「day」,但是也有很多其他的選擇。你可以在這裡查看整個列表。
10. date_range函數
它提供了一種更靈活的創建DatetimeIndex的方法。
pd.date_range(start='2020-01-10', periods=10, freq='M')
參數的作用是:指定索引中的項數。freq 是頻率,「M」表示一個月的最後一天。
就freq參數而言,date_range非常靈活。
pd.date_range(start='2020-01-10', periods=10, freq='6D')
我們創建了一個頻率為6天的數據。
11. period_range函數
它返回一個PeriodIndex。語法類似於date_range函數。
pd.period_range('2018', periods=10, freq='M')
12. timedelta_range函數
它返回一個TimedeltaIndex。
pd.timedelta_range(start='0', periods=24, freq='H')
13.時區
默認情況下,Panda的時間序列對象沒有指定的時區。
dates = pd.date_range('2019-01-01','2019-01-10')dates.tz is NoneTrue
我們可以使用tz_localize方法為這些對象分配時區。
dates_lcz = dates.tz_localize('Europe/Berlin')dates_lcz.tz<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
14. 創建一個具有指定時區的時間序列
我們還可以使用tz關鍵字參數創建帶有時區的時間序列對象。
pd.date_range('2020-01-01', periods = 5, freq = 'D', tz='US/Eastern')
15. 偏移量
假設我們有一個時間序列索引,並且想為所有的日期偏移一個特定的時間。
A = pd.date_range('2020-01-01', periods=10, freq='D')A
讓我們給這個數據加上一周的偏移。
A + pd.offsets.Week()
16. 移動時間序列數據
時間序列數據分析可能需要移數據點進行比較。移位函數可以移位數據。
A.shift(10, freq='M')
17. Shift vs tshift
移動:移動數據tshift:移動時間索引讓我們創建一個帶有時間序列索引的dataframe,並繪製它以查看shift和tshift之間的區別。
dates = pd.date_range('2020-03-01', periods=30, freq='D')values = np.random.randint(10, size=30)df = pd.DataFrame({'values':values}, index=dates)df.head()
讓我們把原始的時間序列和移位的時間序列一起畫出來。
import matplotlib.pyplot as pltfig, axs = plt.subplots(nrows=3, figsize=(10,6), sharey=True)plt.tight_layout(pad=4)df.plot(ax=axs[0], legend=None)df.shift(10).plot(ax=axs[1], legend=None)df.tshift(10).plot(ax=axs[2], legend=None)
18. 用取樣函數重新採樣
時間序列數據的另一個常見操作是重採樣。根據任務的不同,我們可能需要以更高或更低的頻率重新採樣數據。
Resample創建指定內部的組(或容器),並允許您對組進行合併。
讓我們創建一個包含30個值和一個時間序列索引的Panda系列。
A = pd.date_range('2020-01-01', periods=30, freq='D')values = np.random.randint(10, size=30)S = pd.Series(values, index=A)
以下將返回3天時間內的平均值。
S.resample('3D').mean()
在某些情況下,我們可能對特定頻率的值感興趣。函數返回指定間隔結束時的值。例如,在上一步創建的系列中,我們可能只需要每3天(而不是平均3天)一次的值。
S.asfreq('3D')
20.滾動
滾動對於時間序列數據是一種非常有用的操作。滾動意味著創建一個具有指定大小的滾動窗口,並對該窗口中的數據執行計算,當然,該窗口將滾動數據。下圖解釋了滾動的概念。
值得注意的是,計算開始時整個窗口都在數據中。換句話說,如果窗口的大小為3,那麼第一次合併將在第三行進行。
讓我們為我們的數據應用一個3天的滾動窗口。
S.rolling(3).mean()[:10]
結論
我們已經全面介紹了用Pandas進行時間序列分析。值得注意的是,Pandas提供了更多的時間序列分析。
感謝您的閱讀。如果你有任何反饋,請告訴我。
作者:Soner Yldrm
deephub翻譯組:孟翔傑