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'])

扫描二维码关注公众号,回复: 4473804 查看本文章

#获取日期

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)

猜你喜欢

转载自www.cnblogs.com/yongfuxue/p/10107245.html
今日推荐