时间序列

日期和时间数据的类型及工具

delta=datetime(2011,1,7)-datetime(2008,6,24,8,15)
delta
delta.days
delta.seconds
#timedelta表示两个datetime值之间的差
from datetime import timedelta
start=datetime(2011,1,7)
start+timedelta(12)

字符串与datetime互相转换

时间格式转字符格式

stamp=datetime(2011,1,3)
str(stamp)
stamp.strftime('%Y-%m-%d')

字符串格式转时间格式

strptime

value='2011-01-03'
datetime.strptime(value,'%Y-%m-%d')
datestrs=['7/6/2011','8/6/2011']
[datetime.strptime(x,'%m/%d/%Y') for x in datestrs]

parse

from dateutil.parser import parse
parse('2011-01-03')
parse('Jan 31,1997 10:45 PM')

to_datetime

datestrs=['2011-07-06 12:00:00','2011-08-06 00:00:00']
pd.to_datetime(datestrs)

时间序列基础

#补充
ts=np.random.randn(6)
print(ts)
ts[::2]#隔一个元素取一个元素

索引、选择、子集

longer_ts=pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
longer_ts['2001-05']#传递年月制造数据切片
#使用datetime对象进行切片
longer_ts[datetime(2001,1,7):]

日期范围、频率和移位

生成日期范围

#生成日期范围
index=pd.date_range('2012-04-01','2012-06-01')#给定起止时间
pd.date_range(start='2012-04-01',periods=20)#给定起始时间和区间
#只需要符合要求的日期
pd.date_range('2000-01-01','2000-12-01',freq='BM')#每个月最后一个工作日日期
pd.date_range('2000-01-01','2000-12-01',freq='M')#每个月月末日期
pd.date_range('2000-01-01','2000-12-01',freq='BQS-FEB')
#将具体日期转化为标准化零点时间
pd.date_range('2012-05-02 12:56:31',periods=5,normalize=True)

freq生成频率和日期偏置

pd.date_range('2000-01-01',periods=10,freq='1h30min')
#月中某星期的日期
rng=pd.date_range('2012-01-01','2012-09-01',freq='WOM-3FRI')#获取每月第三个星期五

shift移位日期(前向、后向)不改变索引

ts=pd.Series(np.random.randn(4),index=pd.date_range('1/1/2000',periods=4,freq='M'))
ts.shift(2)#向后移位,不改变索引
ts.shift(-2)#向前移位,不改变索引
ts/ts.shift(1)-1#计算多列时间序列的百分比变化(算同比或者环比)

#已知并改变频率推移时间戳
ts.shift(2,freq='M')
ts.shift(3,freq='D')

偏置移位日期

#使用偏置进行移位日期
from datetime import datetime
from pandas.tseries.offsets import Day,MonthEnd
now=datetime(2011,11,17)
now+3*Day()#now向后偏移3天
now+MonthEnd()#now偏移至本月末
now+MonthEnd(2)#now偏移至下月末

offset=MonthEnd()
offset.rollforward(now)#将日期向前移动至月末
offset.rollback(now)#将日期向后移动至月末

#与groupby使用,将日期聚合为对应月的月末
ts=pd.Series(np.random.randn(20),index=pd.date_range('1/15/2000',periods=20,freq='4d'))
ts.groupby(offset.rollforward).mean()

时间区间和区间算数

#to_period将时间戳转化为区间 
rng=pd.date_range('1/29/2000',periods=6,freq='D')
ts2=pd.Series(np.random.randn(6),index=rng)
ts3=ts2.to_period('M')
#to_timestamp将区间转化为时间戳
ts3.to_timestamp(how='start')
#PeriodIndex将区间数组联合
index=pd.PeriodIndex(year=data.year,quarter=data.quarter,freq='Q-DEC')

重新采样与频率转换

resample类似于groupby,调用resample对数据进行分组,之后在调用聚合函数,他可以用于处理大型时间序列。

向下采样:高频率变为低频率

rng=pd.date_range('2000-01-01',periods=12,freq='T')
ts=pd.Series(np.arange(12),index=rng)
ts
print(ts)
#向下采样
#5min限制区间长度,closed限制区间闭合状态,right为左开右闭
ts.resample('5min',closed='right').size()
ts2=ts.resample('5min',closed='right',label='left').size()#设置label显示区间边界,若为left显示上区间边界
ts3=ts2.shift(2,freq='s')#shift进行移动等价于:
ts4=ts2.resample('5min',closed='right',label='left',loffset='2s').size()

向上采样:低频率变为高频率

frame=pd.DataFrame(np.random.randn(2),index=pd.date_range('1/1/2000',periods=2,freq='W-WED'),columns=['la'])
frame.resample('D').asfreq()
frame.resample('D').ffill()#向上填充
frame.resample('D').bfill(limit=2)#向下填充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值