基础操作
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)