在進行金融資料的分析以及量化研究時,總是避免不了和時間序列的資料打交道,常見的時間序列的資料有比方說一天内随着時間變化的溫度序列,又或者是交易時間内不斷波動的股票價格序列,今天小編就為大家來介紹一下如何用“Pandas”子產品來處理時間序列的資料
01
建立一個時間戳
首先我們需要導入我們所需要用到的子產品,并且随機建立一個時間戳,有兩種方式來建立,如下所示
import pandas as pd
import numpy as np
from datetime import datetime
pd.to_datetime('2021-05-20') ##output: Timestamp('2021-05-20 00:00:00')
pd.Timestamp('2021-05-20') ##output: Timestamp('2021-05-20 00:00:00')
02
通路時間資訊
我們可以來檢視一下這個時間戳所代表的年、月、日等資訊
a = pd.Timestamp('2021-10-01')
a.day_name() ## Friday,看來今年的10月1日是周五哈?
a.month_name() ## October 十月份
a.day(), a.month(), a.year() ## 1, 10, 2021,檢視年月日等資訊
03
資料格式轉化為時間序列
接下來我們做一些資料處理,例如将資料集中的“time_frame”轉化為時間序列的格式
df = pd.DataFrame({"time_frame": ["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05"]})
df['time_frame'] = pd.to_datetime(df['time_frame'])

04
字元串轉化成時間格式
要是我們想将裡面的時間序列的資料變成字元串時,可以這麼來操作
date_string = [str(x) for x in df['time_frame'].tolist()]
當然從字元串轉換回去時間序列的資料,在“Pandas”中也有相應的方法可以來操作,例如
time_string = ['2021-02-14 00:00:00', '2021-02-14 01:00:00', '2021-02-14 02:00:00', '2021-02-14 03:00:00', '2021-02-14 04:00:00', '2021-02-14 05:00:00', '2021-02-14 06:00:00']
pd.to_datetime(time_string, infer_datetime_format = True)
當然我們還有其他的方式來實作将字元串轉換成時間格式,例如
import datetime
text_1 = "2021-02-14"
datetime.datetime.strptime(text_1, '%Y-%m-%d')
05
提取時間格式背後的資訊
在時間序列的資料處理過程當中,我們可能需要經常來實作下面的需求
l求某個日期對應的星期數(2021-06-22是第幾周)
l判斷一個日期是周幾(2021-02-14是周幾)
l判斷某一日期是第幾季度,等等
當資料集中的某一列已經轉化為是“datetime64”的格式時,僅需要用到“dt”的方法,就可以快速得到相應的結果,例如
df = pd.DataFrame({"time_frame": ["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05", "2021-01-06", "2021-01-07", "2021-01-08"]})
df["time_frame"] = pd.to_datetime(df["time_frame"])
# 一周中的第幾天
df.time_frame.dt.dayofweek[0]
# 傳回對應額日期
df.time_frame.dt.date[0]
# 傳回一周中的第幾天,0對應周一,1對應周二
df.time_frame.dt.weekday[0]
除此之外,下表列出了幾個并不常見的方法和屬性
06
關于date_range函數
可用于建立時間索引,并且時間頻率可以靈活調整,參數“freq”就是用來調整時間頻率的,“M”代表月份,“D”就代表的是天數了
pd.date_range(start='2021-02-14', periods=10, freq='M')
07
period_range和timedelta_range函數
和上面的“date_range”函數類似,用于建立時間索引
pd.period_range('2021', periods=10, freq='M')
pd.timedelta_range(start='0', periods=24, freq='H')
08
關于重采樣resample
我們也可以對時間序列的資料集進行重采樣,重采樣就是将時間序列從一個頻率轉換到另一個頻率的處理過程,主要分為降采樣和升采樣,将高頻率、間隔短的資料聚合到低頻率、間隔長的過程稱為是降采樣,反之則是升采樣.
我們先來建立一個包含30個值和一個時間序列索引的資料集
A = pd.date_range('2021-01-01', periods=30, freq='D')
values = np.random.randint(10, size=30)
S = pd.Series(values, index=A)
傳回5天時間内的資料加總
S.resample('5D').sum()
09
關于滑動視窗“rolling”和“expanding”
是以便就有了滑動視窗這一個概念,簡而言之就是将某個時點的資料衍生到包含這個時點的一段時間内做一個資料統計。首先我們先來建立需要用到的資料集
index = pd.date_range('2021-01-01',periods=30)
data = pd.DataFrame(np.arange(len(index)),index=index,columns=['test'])
主要有“rolling”方法和“expanding”方法,“rolling”方法考慮的是一定的時間段内的資料,而“expanding”考慮的則是之前所有的資料,例如
# 移動3個值,進行求和
data['sum'] = data.test.rolling(3).sum()
# 移動3個值,進行求平均數
data['mean'] = data.test.rolling(3).mean()
data['mean'].fillna(method = 'backfill')
qq群851320808