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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM