zoukankan      html  css  js  c++  java
  • 6-时序数据处理之日期(Period、PeriodIndex、asfreq、财政年度)及算数运算(to_timestamp()、to_period())

    一、时期

    1、时期的创建

      时期(Period)表示的是时间区间,如数日、数月、数季、数年等。时期的创建需要一个字符或整数以及一个freq参数

    注意:其中freq参数可以参考日期的基础频率表,详见另一篇博文【Pandas时序数据处理(日期范围pd.date_range()、频率(基础频率表)及移动(shift()、rollforward()、rollback()))第二部分

    :创建一个从20200101到20201231的时期

    >>> import pandas as pd
    >>> p = pd.Period(2020,freq = 'A-DEC')
    >>> p
    Period('2020', 'A-DEC')
    

    2、Period对象如何实现位移?

      答:加上或减去一个整数

    >>> p+10
    Period('2030', 'A-DEC')
    

    3、相同频率的Period对象

      若两个Period对象由相同的频率,那么这两个Period对象的差就是两个时间段的单位数量;

    >>> pd.Period(2030,freq='A-DEC')-p
    <10 * YearEnds: month=12>
    

    4、PeriodIndex 

      period_range()函数用于创建规则的时间范围,生成PeriodIndex类型数据;

      来看看其用法与创建规则的日期范围date_range()的区别:

    >>> pd.period_range('2020-01-01','2020-09-01',freq='2M')
    PeriodIndex(['2020-01', '2020-03', '2020-05', '2020-07', '2020-09'], dtype='period[2M]', freq='2M')
    
    >>> pd.date_range('2020-01-01','2020-09-01',freq='2M')
    DatetimeIndex(['2020-01-31', '2020-03-31', '2020-05-31', '2020-07-31'], dtype='datetime64[ns]', freq='2M')

      从上述例子可以看到,PeriodIndex类型数据的元素类型是period[2M],而DatetimeIndex类型数据的元素类型是datetime64[ns]。

      只要PeriodIndex类保存了一组,就可以在任何Pandas数据结构中被用作轴索引

    >>> s = pd.Series(np.random.randint(0,10,4))
    >>> s.index = pd.period_range('202001','202004',freq='M')
    >>> s
    2020-01    2
    2020-02    0
    2020-03    2
    2020-04    5
    

      PeriodIndex类的构造还允许直接使用一组字符串

    >>> values = ['2018Q1','2019Q2','2020Q3']
    >>> index = pd.PeriodIndex(values,freq = 'Q-DEC')
    >>> index
    PeriodIndex(['2018Q1', '2019Q2', '2020Q3'], dtype='period[Q-DEC]', freq='Q-DEC')
    

    5、通过asfreq频率转换日期 

      Period对象和PeriodIndex对象都可以通过asfreq方法被转换成别的频率;

    (1)参数how:注意start和end

      :将一个年度时期转换为当年年初或年末的月度时期(以12月结束的财政年度)

    >>> p = pd.Period(2007,freq = 'A-DEC')
    >>> p.asfreq('M',how = 'start')
    Period('2007-01', 'M')
    
    >>> p.asfreq('M',how = 'end')
    Period('2007-12', 'M')
    

      

      例:不以12月结束的财政年度,若是以6月结束的财政年度,那么年初、年末的月度时期分别为2006年7月、2007年6月

    >>> p = pd.Period(2007,freq = 'A-JUN')
    >>> p.asfreq('M',how = 'start')
    Period('2006-07', 'M')
    >>> p.asfreq('M',how = 'end')
    Period('2007-06', 'M')
    

      

     (2)高频率转换为低频率

    :将2007年8月的频率转换为'A-JUN'后,月份 2007年8月将属于2008年财政年度(年相较于月,年为低频率,月为高频率,一年12个月)

        以asfreq中为准

    >>> p = pd.Period('2007-08','M')
    >>> p
    Period('2007-08', 'M')
    >>> p+1
    Period('2007-09', 'M')
    
    >>> p.asfreq('A-JUN')
    Period('2008', 'A-JUN')
    >>> p.asfreq('A-JUN')+1
    Period('2009', 'A-JUN')
    

      

      (3)时间序列频率转换

      PeriodIndex和时间序列的频率转换方法一致

    >>> rng = pd.period_range('2015','2018',freq = 'A-DEC')
    >>> ts = pd.Series(np.random.randint(0,10,4),index = rng)
    >>> ts
    2015    6
    2016    6
    2017    8
    2018    9
    Freq: A-DEC, dtype: int32
    
    >>> ts.asfreq('M',how = 'start')
    2015-01    6
    2016-01    6
    2017-01    8
    2018-01    9
    >>> ts.asfreq('M',how = 'end')
    2015-12    6
    2016-12    6
    2017-12    8
    2018-12    9
    Freq: M, dtype: int32
    
    >>> ts.asfreq('Q-JAN',how = 'start')
    2015Q4    6
    2016Q4    6
    2017Q4    8
    2018Q4    9
    

      (4)季度性频率

      Pandas支持12种可能的季度型频率,即从Q-JAN到Q-DEC,下表以2012年的Q-DEC、Q-SEP、Q-JAN为例

      即季度型频率freq设置为谁,谁就是Q4,因为其含义本就表示财政年末


    #在以1月结束的财政年中,2012Q4是从2011年11月到2012年1月
    >>> p = pd.Period('2012Q4',freq = 'Q-JAN')
    >>> p
    Period('2012Q4', 'Q-JAN')
    >>> p.asfreq('D',how = 'start')
    Period('2011-11-01', 'D')
    >>> p.asfreq('D',how = 'end')
    Period('2012-01-31', 'D')
    
    >>> p.asfreq('M',how = 'start')
    Period('2011-11', 'M')
    >>> p.asfreq('B',how = 'start')
    Period('2011-11-01', 'B')
    >>> p.asfreq('B',how = 'end')
    Period('2012-01-31', 'B')
    

    二、时期之间的算数运算

     :需要获取时期p的倒数第二个工作日下午4点的时间戳

    步骤1:使用第一个asfreq将时期p转换成日期型频率,得到p的倒数第二个工作日的日期

    步骤2:使用第二个asfreq将日期型频率转换成时型频率,得到p的倒数第二个工作日的时间

    步骤3:将时型频率转换成时间戳

    >>> p
    Period('2012Q4', 'Q-JAN')
    #步骤1
    >>> p_next = p.asfreq('B',how = 'end')-1
    >>> p_next
    Period('2012-01-30', 'B')
    
    #步骤2
    >>> p4_p_next = p_next.asfreq('H',how = 'start')+16
    >>> p4_p_next
    Period('2012-01-30 16:00', 'H')
    
    #步骤3
    >>> p4_p_next.to_timestamp()
    Timestamp('2012-01-30 16:00:00')
    

      时间戳和日期之间的转换

    • 转为时间戳:to_timestamp()
    • 转为日期:to_period()

     例:通过数组创建PeriodIndex(年和嫉妒存放于不同的列中,将其合并并设为索引)

    >>> data = pd.DataFrame({'year':[2019,2019,2019,2019,2020,2020],'quarter':[1,2,3,4,1,2]})
    >>> data['number'] = np.random.randint(0,100,6)
    >>> data
       year  quarter  number
    0  2019        1      51
    1  2019        2      42
    2  2019        3      46
    3  2019        4       8
    4  2020        1      88
    5  2020        2      63
    
    >>> index = pd.PeriodIndex(year = data['year'],quarter = data['quarter'],freq = 'Q-DEC')
    >>> index
    PeriodIndex(['2019Q1', '2019Q2', '2019Q3', '2019Q4', '2020Q1', '2020Q2'], dtype='period[Q-DEC]', freq='Q-DEC')
    >>> data.index = index
    >>> data.drop(['year','quarter'],axis=1,inplace = True)
    >>> data
            number
    2019Q1      51
    2019Q2      42
    2019Q3      46
    2019Q4       8
    2020Q1      88
    2020Q2      63
    

     

  • 相关阅读:
    Django(模板语言-自定义filter和simple_tag)
    vue项目创建步骤小结
    scrapy 相关
    face parsing(人脸解析)
    FSRNet: End-to-End Learning Face Super-Resolution with Facial Priors论文阅读
    第一周,深度学习的实用层面
    如何阅读英文文献
    学习笔记
    Joint Super-Resolution and Alignment of Tiny Faces
    Super-FAN:Integrated facial landmark localization and super-resolution of real-world low resolution faces in arbitrary poses with GANs论文阅读
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13507697.html
Copyright © 2011-2022 走看看