数据分析师-pandas时间模块datetime

主要: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个月,每月第一个日历日

你可能感兴趣的:(数据分析师-pandas时间模块datetime)