主要:datetime.date()、datetime.datetime()、datetime.timedelta()
日期解析方法:parser.parse
一、时间模块 import datetime
1.datetime.date:date对象,date是datetime中的方法
(1)datetime.date.today()#today()会根据日期的变化输出今天的日期,返回的是datetime.date类,例如:想把一个月数据聚合成四周的产量--如果是str需要手动按照七天间隔,而datetime.date可以直接用来做
(2)datetime.date(2018,10,1)
2.datetime.datetime:直接生成时间戳
(1)datetime.datetime.now()#返回今天的年月日时分秒,返回的是datetime.datetime类
(2)datetime.datetime类相减得到相差的时间,返回的是datetime.timedelta时间差类
3.datetime.timedelta:时间差,默认是天
datetime.timedelta(100,3600)#时间差为100天+3600秒
4.日期和字符串转换方法:parser.parse,可以识别任何相似于时间的字符串
from dateutil.parser import parse
print(parse('2000-11-1'))
print(parse('11/11/2000'))
print(parse('5/1/2018',dayfirst = True))#dayfirst为True可以设置日在月之前
print(parse('Jan 31,1997 10:45PM'))
#各种格式都可以判断,但不能出现中文
二、pandas里的时刻数据:pd.Timestamp
1. 时刻数据代表时间点,是pd的数据类型;pd.Timestamp():时间点可以是一个月 一分钟 一秒,直接生成pandas的时刻数据--即时间戳,类型为pandas.Timestamp
注意:只适用于单个时间
2.pd.to_datetime():多个时间数据转换时间戳索引pandas的DatetimeIndex,单个时间数据转换成Timestamp
t3 = ['2017-10-20','2017-10-20','2017-10-20','2017-10-20']
(1)当为多个时间数据时,返回DatetimeIndex时间序列标签类,可以变成Series的index
(2)当一组时间序列中有其他格式数据,会报错;也可以用errors='ignore'参数返回原始输入,生成一般的数组;errors='coerce'参数返回datetimeIndex,并变为缺失值NaT
(3)print(pd.Timestamp(t3),type(t3))#会报错
三、pandas时戳索引
pd.DatetimeIndex()时间戳索引:直接把时间序列变成时间戳索引
rng[0]#按照索引生成时间戳Timestamp
** TimeSeries时间序列:以DatetimeIndex的index的Series,为TimeSeries,时间序列
四、pd.date_range()日期范围/工作日pd.bdate_range
pd.date_range(start开始时间,end结束时间,periods时期,freq默认频率day,normalize=True把时间归为凌晨零点)
2种生成方式:start+end or start/end+periods
例如:rng1 = pd.date_range('1/1/2017','1/10/2017')
rng2 = pd.date_range(start = '1/1/2017',periods =10,freq = 'H')#freq='H'按小时
print(pd.date_range('1/1/2017','1/11/2017',closed='right'))closed:默认为左闭右闭;left为左闭右开;right为左开右闭
注意:由于date_range返回的是DatetimeIndex类,当被list后返回的是一个个的时间戳Timestamp(pandas中精度最小的时间单位)
五、afreq:时期频率的转换
ts = pd.Series(np.random.rand(4),index=pd.date_range('20170101','20170104'))
print(ts.asfreq('4H',method='ffill'))#method参数:插值 ffill用之前的填充 bfill用之后的填充
六、pd.date_range()超前和滞后
ts = pd.Series(np.random.rand(4),index=pd.date_range('20170101','20170104'))
print(ts.shift(2))#.shift(正数):向后移
print(ts.shift(-2))#.shift(负数):向前移
#意义:比如有十天的营收数据,想看当天比前一天的涨跌情况,得到的负数就是跌了,正数就是涨了
per = ts/ts.shift(1)-1
#加上freq参数,多时间戳进行位移,而不仅对数值进行位移=D按照天,=T按照小时
print(ts.shift(2,freq = 'D'))、print(ts.shift(2,freq = 'T'))
七、pandas的时期pd.period()
1.pd.Period() 类似于DatatimeIndex时间戳:
p = pd.Period('2017',freq='M')生成以2017-01开始,月为频率的时间构造器;freq指明period长度,时间戳则说明该period在时间轴上的位置
注意:print(p+1)#按照freq进行运算
2.pd.period_range()类似于date_range()时间戳
prng = pd.period_range('1/1/2011','1/1/2013',freq='M')生成的按月 2011-01,数据格式为PeriodIndex,单个数值为Period
rng = pd.date_range('1/1/2011','1/1/2013',freq='M')生成的按天2011-01-01
3.asfreq频率转换
p = pd.Period('2017','A-DEC')--每年制定月份的最后一个日历日所在的年,变为M/D
print(p.asfreq('M',how='start'))#how参数=start以开始,=end以结束 print(p.asfreq('D',how='end'))
ts2 = pd.Series(np.random.rand(len([prng])),
index=prng.asfreq('D',how='end'))#asfreq也可以转换TimeSeries的index
4.时间戳DatatimeIndex与时期Period的转换:pd.to_period()/pd.timestamp()
ts1.to_period()、ts2.to_timestamp()
八、时间序列的重采样
将时间序列的一个频率转换成另一个频率,且会有数据的结合
降采样:高频数据-低频数据,eg以天为频率的数据转换为以月为频率的数据
升采样:低频数据-高频数据,eg以年为频率的数据转换为以月为频率的数据
1.降采样:需要聚合
ts.resample('5D') #得到重采样的构建器DatetimeIndexResampler,是个中间值,需要指示聚合方式,频率为5天
ts_re2 = ts.resample('5D',closed='left',label='right').sum()#重采样的最终值,得到聚合后的Series;
label:重采样后以那个标签为索引,默认写left;closed:默认左闭右闭
聚合方法:
print(ts.resample('5D').sum())#均值
print(ts.resample('5D').max())#最大值
print(ts.resample('5D').min())#最小值
print(ts.resample('5D').median())#中值
print(ts.resample('5D').first())#第一个值
print(ts.resample('5D').last())#第二个值
print(ts.resample('5D').ohlc())#OHLC重采样:open开盘 high最大值 low最小值 close收盘-金融
2.升采样:需要填充
ts.resample('15T').asfreq() #不做填充,返回NaN
ts.resample('15T').ffill()/bfill():上填充和下填充
九、时间序列中的索引和切片
1.索引:方法与DataFrame和Series相似--只要能表示时间的都可以拿来做标签的索引下标索引和标签索引
2.切片:下标切片,类似Series,左闭右开;标签切片,左闭右闭;#标签切片只写月会出现月的所有日
3.重复索引的时间序列 .is_unique值是否唯一,index.is_unique判断index是否唯一,返回True和False,可以用来做布尔型索引
总结:pandas的时间模块
pd.Timestamp():单数据时间戳
pd.to_datetime():多数据的时间戳
pd.DatatimeIndex():多数据的时间戳,可以作为Series的index;还可以索引
在没有现成时间数据情况下:pd.date_range()日期范围
附:pd.date_range():日期范围一讲,频率freq
# print(pd.date_range('2017/1/1','2017/1/4'))#默认freq='D',每日历日
# print(pd.date_range('2017/1/1','2017/1/4',freq='B'))#freq='B',每工作日
# print(pd.date_range('2017/1/1','2017/1/4',freq='H'))#freq='H',每小时
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='T'))#freq='T/MIN',每分钟
# print(pd.date_range('2017/1/1 12:00:00','2017/1/4 12:10:10',freq='S'))#freq='S',每秒
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='L'))#freq='L',每毫秒
# print(pd.date_range('2017/1/1 12:00','2017/1/4 12:10',freq='U'))#freq='U',每微秒
print(pd.date_range('2017/1/1','2017/1/4',freq='W-MON'))
# W-MON从指定星期几开始算起,每周
print(pd.date_range('2017/1/1','2018/1/4',freq='WOM-2MON'))
# WOM-nMON,每月的第几个星期几开始算
# 时间序列:DatimeIndex与TimeSeries
pd.date_range()-日期范围二讲,频率
print(pd.date_range('2017','2018',freq='M'))
print(pd.date_range('2017','2020',freq='Q-MAY'))
print(pd.date_range('2017','2018',freq='A-DEC'))
print('--'*20)
#M:每月最后一个日历日
#Q-月:指定月为季度末,每个季度末最后一月的最后一个日历日
#A-月:每年制定月份的最后一个日历日
#月编写:JAN
#所以Q-月只有三种情况:1-4-7-10,2-5-8-11,3-6-9-12
print(pd.date_range('2017','2018', freq = 'BM'))
print(pd.date_range('2017','2020', freq = 'BQ-DEC'))
print(pd.date_range('2017','2020', freq = 'BA-DEC'))
print('------')
# BM:每月最后一个工作日
# BQ-月:指定月为季度末,每个季度末最后一月的最后一个工作日
# BA-月:每年指定月份的最后一个工作日
print(pd.date_range('2017','2018', freq = 'MS'))
print(pd.date_range('2017','2020', freq = 'QS-DEC'))
print(pd.date_range('2017','2020', freq = 'AS-DEC'))
print('------')
# M:每月第一个日历日
# Q-月:指定月为季度末,每个季度末最后一月的第一个日历日
# A-月:每年指定月份的第一个日历日
print(pd.date_range('2017','2018', freq = 'BMS'))
print(pd.date_range('2017','2020', freq = 'BQS-DEC'))
print(pd.date_range('2017','2020', freq = 'BAS-DEC'))
print('------')
# BM:每月第一个工作日a
# BQ-月:指定月为季度末,每个季度末最后一月的第一个工作日
# BA-月:每年指定月份的第一个工作日
pd.date_range()-日期范围,复合频率
print(pd.date_range('2017/1/1','2017/2/1',freq='7D'))# 7天
print(pd.date_range('2017/1/1','2017/2/1',freq='2h30min'))# 2.5小时
print(pd.date_range('2017/1/1','2018/2/1',freq='2MS'))#每间隔2个月,每月第一个日历日
网友评论