美文网首页Python与数据分析
【Python学习笔记】时间序列

【Python学习笔记】时间序列

作者: 清梦载星河 | 来源:发表于2019-08-05 19:30 被阅读0次
    随便放个镇楼图,图片源自unsplash

    1. Python的日期与时间工具

    Python基本的日期与时间功能都在标准库的datetime模块中,例如使用datetime类型创建一个日期,返回一个datetime对象:

    from datetime import datetime
    #创建日期2019年8月5日
    dt1 = datetime(2019,8,5)
    

    返回当前时刻及其年、月、日、周等:

    >>>from datetime import datetime
    >>>datetime.now()
    #2019年8月5日15时38分1秒
    datetime.datetime(2019, 8, 5, 15, 38, 1, 345990)
    
    >>>datetime.now().year
    2019
    
    >>>datetime.now().month
    8
    
    >>>datetime.now().day
    14
    
    >>>datetime.now().weekday()+1
    #周一
    1
    
    >>>datetime.now().isocalendar()
    #2019年第32周的第1天
    (2019,32,1)
    >>>datetime.now().isocalendar()[1]
    #返回周数
    32
    

    设置指定的日期、时间格式:

    >>>from datetime import datetime
    >>>datetime.now().date()
    datetime.date(2019, 8, 5) #只显示日期
    >>>datetime.now().time()
    datetime.date(2019, 8, 5) #只显示时间
    
    #使用strftime()函数可自定义时间和日期的格式
    >>>datetime.now().strftime('%Y%m%d')
    '20190805'
    

    时间计算:

    datetime2 = datetime1 + timedelta
    
    datetime2 = datetime1 - timedelta
    
    timedelta = datetime1 - datetime2
    
    datetime1 < datetime2
    

    datetime模块在易用性和灵活性方面表现良好,但如果需要处理的时间数据量比较大时,datetime的速度就会比较慢。

    2. Pandas的日期与时间工具

    Pandas所有关于日期与时间的处理方法全部都是通过Timestamp对象实现的,通过一组Timestamp对象就可以创建一个作为Series或DateFrame索引的DatetimeIndex。

    import pandas as pd
    dt2 = pd.to_datetime('21090805')
    
    print(dt2)
    #Timestamp('2109-08-05 00:00:00')
    
    print(dt2.date())
    #datetime.date(2109, 8, 5)
    

    在Pandas中,用来处理时间序列的基本数据类型有三种:

    • Timestamp类型,针对处理时间戳数据,对应的索引数据结构是DatetimeIndex,创建规律性时间序列的方法为:pd.date_range()。
    • PeriodIndex类型,针对处理时间周期数据,对应的索引数据结构是PeriodIndex,创建规律性时间序列的方法为:pd.period_range()。
    • Timedelta类型,针对处理时间增量或持续时间,对应的索引数据结构是TimedeltaIndex,创建规律性时间序列的方法为:pd.timedelta_range()。

    在pd.xxx_range()中,参数period用于设置周期数,freq用于设置时间间隔。

    用时间作为索引

    可以用DatetimeIndex()生成时间索引,例:

    indx = pd.DatetimeIndex(['201908','201909','201910','201911'])
    df = pd.DataFrame(.......,index=indx)
    

    或者使用pd.xxx_range()生成一个有规律的时间序列,例:

    import pandas as pd
    import numpy as np
    
    dtindx = pd.date_range('20190805',periods=17,freq='H')
    dfdt = pd.DataFrame(np.random.randint(10,100,(17,3)),index=dtindx,columns=list('abc'))
    
    print(dfdt)
    #                       a   b   c
    # 2019-08-05 00:00:00  19  35  66
    # 2019-08-05 01:00:00  94  94  69
    # 2019-08-05 02:00:00  92  77  83
    # 2019-08-05 03:00:00  61  50  46
    # 2019-08-05 04:00:00  48  14  11
    # 2019-08-05 05:00:00  96  94  53
    # 2019-08-05 06:00:00  64  56  39
    # 2019-08-05 07:00:00  60  26  72
    # 2019-08-05 08:00:00  33  59  84
    # 2019-08-05 09:00:00  49  51  99
    # 2019-08-05 10:00:00  90  22  93
    # 2019-08-05 11:00:00  68  95  27
    # 2019-08-05 12:00:00  91  17  26
    # 2019-08-05 13:00:00  79  49  87
    # 2019-08-05 14:00:00  31  81  18
    # 2019-08-05 15:00:00  69  88  33
    # 2019-08-05 16:00:00  83  97  44
    

    时间频率与频率转换

    时间频率指的是时间周期,即periods参数,pandas的频率代码如下:

    代码 描述 代码 描述
    D B 天(仅含工作日)
    W
    M 月末 BM 月末(仅含工作日)
    Q 季末 BQ 季末(仅含工作日)
    A 年末 BA 年末(仅含工作日)
    H 小时 BH 小时(工作时间)
    T 分钟
    S
    L 毫秒
    U 微妙
    N 纳秒

    带开始索引的频率代码:

    代码 频率
    MS 月初
    BMS 月初(仅含工作日)
    QS 季初
    BQS 季初(仅含工作日)
    AS 年初
    BAS 年初(仅含工作日)

    使用 .asfreq() 进行频率转换。或者使用 resample() 。
    一般情况下,resample比asfreq更常用,两者主要差异为resample()是以数据累计为基础,而asfreq()是以数据选择为基础。

    频率转换对缺失值的默认处理为向前取样,也就是在里面填充NaN,填缺参数有两种:

    • bfill,向后取样
    • ffill,向前取样

    时间迁移

    时间迁移常用在计算数据在不同时段的差异,Pandas有两种此类方法:

    • shift(),迁移数据;
    • tshift(),迁移索引

    相关文章

      网友评论

        本文标题:【Python学习笔记】时间序列

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