1. 程式人生 > >pandas的時間序列:日期操作、時間序列平滑

pandas的時間序列:日期操作、時間序列平滑

 
基礎操作

1)將“字元型別的日期列”轉化成“時間索引(DatetimeIndex)”

 

u  首先,利用 pandas 的to_datetime 方法,把 "date" 列的字元型別資料解析成 datetime 物件。然後,把 "date" 列用作索引。

df['date'] = pd.to_datetime(df['date'])

df.set_index("date", inplace=True)

 

u  一步轉化

df2.index = pd.DatetimeIndex(df.index)

 

 

temp = pd.DatetimeIndex(data['datetime'])

 

#獲取日期

data['date'] = temp.date

#獲取時間點

data['time'] = temp.time

 

#將日期轉化為一週中的星期幾

pd.DatetimeIndex(data.date).dayofweek

 

# 對時間類特徵處理,產出一個時間長度變數

data['dateDays'] = (data.date - data.date[0]).astype('timedelta64[D]')

 

 

2)將日期列索引轉化每月當中的第幾天,或者轉化為一週裡面的星期幾。

 

再次使用bikes資料集

bikes = pd.read_csv('../data/bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')

 

berri_bikes.index.day

 

berri_bikes.index.weekday

 

3)不規整的日期字串會自動轉化為標準型別來進行索引

 

bikes['1/10/2011']

bikes['20110110']

 

4)根據日期索引獲取資料

 

longer_ts = Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

 

#獲取2001年的所有行

longer_ts['2001']

 

#獲取2001年5月的所有行

longer_ts['2001-05']  同longer_ts.ix['5-2001']

 

#獲取2011.01.07後的所有資料

longer_ts [datetime(2011, 1, 7):]  切片操作

 

 

dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000', '1/2/2000', '1/3/2000'])

dup_ts = Series(np.arange(5), index=dates)

 

#判斷日期索引中每個日期是否是單一的

dup_ts.index.is_unique

 

#如果索引的日期是單一的,返回該行的索引值

dup_ts['1/3/2000']

 

#如果索引的日期不是單一的,返回所有相同索引的行

dup_ts['1/2/2000']

 

日期的範圍、頻率與移動

 

下表是時間頻率單位:

 

 

 

 

 

 

#生成某個範圍的日期序列

pd.date_range('4/1/2012', '6/1/2012')

pd.date_range(start='4/1/2012', periods=20)

pd.date_range(end='6/1/2012', periods=20)

pd.date_range('5/2/2012 12:56:31', periods=5)

pd.date_range('5/2/2012 12:56:31', periods=5, normalize=True)  #返回的日期格式5/2/2012

 

 

#以一定頻率產生時間序列

pd.date_range('1/1/2000', '12/1/2000', freq='BM')  #返回給定日期範圍內每個月的最後一個工作日

pd.date_range('1/1/2000', '1/3/2000 23:59', freq='4h')

pd.date_range('1/1/2000', periods=10, freq='1h30min')

pd.date_range('1/1/2012', '9/1/2012', freq='WOM-3FRI')

 

# shift()將時間序列整體向前或向後移動固定長度的時間

ts = Series(np.random.randn(4), index=pd.date_range('1/1/2000', periods=4, freq='M'))

 

ts.shift(2)

>>> 

2000-01-31         NaN

2000-02-29         NaN

2000-03-31      1.529481

2000-04-30      0.267158

 

ts.shift(-2)  #向後移動

 

#假設資料是股票價格資料,shift()常用來計算股票收益率

ts / ts.shift(1) – 1 

 

#按照某一個頻率移動

ts.shift(2, freq='M')

ts.shift(3, freq='D')

ts.shift(1, freq='3D')

ts.shift(1, freq='90T')

 

#時間序列滾動的第二種方式

from pandas.tseries.offsets import Day, MonthEnd

now = datetime(2011, 11, 17)

 

now + 3 * Day()  #滾動到3天后的日期

now + MonthEnd()  #滾動到當月末

now + MonthEnd(2)  #滾動到下個月末

 

#時間滾動的第三種方式

offset = MonthEnd()

offset.rollforward(now)  #從當前日期向前滾動到當月末

offset.rollback(now)   #從當前日期向後滾動到上月末

 

#計算平均值很重要的一種方式

from pandas.tseries.offsets import Day, MonthEnd

offset = MonthEnd()

 

ts = Series(np.random.randn(20), index=pd.date_range('1/15/2000', periods=20, freq='4d'))

ts.groupby(offset.rollforward).mean()  #按月滾動,即計算每個月的平均值

 

時間序列的平滑化

 

 

 

 

#移動平均:每個時間點的值均由該時間點前視窗值大小的所有數的平均

pd.rolling_mean(close_px.AAPL, 250).plot()

 

pd.rolling_std(close_px.AAPL, 250, min_periods=10)

 

#指數加權移動平均

pd.ewma(aapl_px, span=60)