美文网首页呆鸟的Python数据分析Python
数据分析师-pandas时间模块datetime

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

作者: 茶小美 | 来源:发表于2019-02-26 16:12 被阅读79次

    主要: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

        本文链接:https://www.haomeiwen.com/subject/mxnoyqtx.html