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)