python Pandas庫基礎(chǔ)分析之時(shí)間序列的處理詳解
前言
在使用Python進(jìn)行數(shù)據(jù)分析時(shí),經(jīng)常會遇到時(shí)間日期格式處理和轉(zhuǎn)換,特別是分析和挖掘與時(shí)間相關(guān)的數(shù)據(jù),比如量化交易就是從歷史數(shù)據(jù)中尋找股價(jià)的變化規(guī)律。Python中自帶的處理時(shí)間的模塊有datetime,NumPy庫也提供了相應(yīng)的方法,Pandas作為Python環(huán)境下的數(shù)據(jù)分析庫,更是提供了強(qiáng)大的日期數(shù)據(jù)處理的功能,是處理時(shí)間序列的利器。
1、生成日期序列
主要提供pd.data_range()和pd.period_range()兩個(gè)方法,給定參數(shù)有起始時(shí)間、結(jié)束時(shí)間、生成時(shí)期的數(shù)目及時(shí)間頻率(freq='M'月,'D'天,‘W',周,'Y'年)等。
兩種主要區(qū)別在于pd.date_range()生成的是DatetimeIndex格式的日期序列;pd.period_range()生成的是PeriodIndex格式的日期序列。
以下通過生成月時(shí)間序列和周時(shí)間序列來對比下:
date_rng = pd.date_range('2019-01-01', freq='M', periods=12) print(f'month date_range(): {date_rng}') """ date_range(): DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31', '2019-09-30', '2019-10-31', '2019-11-30', '2019-12-31'], dtype='datetime64[ns]', freq='M') """ period_rng = pd.period_range('2019/01/01', freq='M', periods=12) print(f'month period_range(): {period_rng}') """ period_range(): PeriodIndex(['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12'], dtype='period[M]', freq='M') """ date_rng = pd.date_range('2019-01-01', freq='W-SUN', periods=12) print(f'week date_range(): {date_rng}') """ week date_range(): DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27', '2019-02-03', '2019-02-10', '2019-02-17', '2019-02-24', '2019-03-03', '2019-03-10', '2019-03-17', '2019-03-24'], dtype='datetime64[ns]', freq='W-SUN') """ period_rng=pd.period_range('2019-01-01',freq='W-SUN',periods=12) print(f'week period_range(): {period_rng}') """ week period_range(): PeriodIndex(['2018-12-31/2019-01-06', '2019-01-07/2019-01-13', '2019-01-14/2019-01-20', '2019-01-21/2019-01-27', '2019-01-28/2019-02-03', '2019-02-04/2019-02-10', '2019-02-11/2019-02-17', '2019-02-18/2019-02-24', '2019-02-25/2019-03-03', '2019-03-04/2019-03-10', '2019-03-11/2019-03-17', '2019-03-18/2019-03-24'], dtype='period[W-SUN]', freq='W-SUN') """ date_rng = pd.date_range('2019-01-01 00:00:00', freq='H', periods=12) print(f'hour date_range(): {date_rng}') """ hour date_range(): DatetimeIndex(['2019-01-01 00:00:00', '2019-01-01 01:00:00', '2019-01-01 02:00:00', '2019-01-01 03:00:00', '2019-01-01 04:00:00', '2019-01-01 05:00:00', '2019-01-01 06:00:00', '2019-01-01 07:00:00', '2019-01-01 08:00:00', '2019-01-01 09:00:00', '2019-01-01 10:00:00', '2019-01-01 11:00:00'], dtype='datetime64[ns]', freq='H') """ period_rng=pd.period_range('2019-01-01 00:00:00',freq='H',periods=12) print(f'hour period_range(): {period_rng}') """ hour period_range(): PeriodIndex(['2019-01-01 00:00', '2019-01-01 01:00', '2019-01-01 02:00', '2019-01-01 03:00', '2019-01-01 04:00', '2019-01-01 05:00', '2019-01-01 06:00', '2019-01-01 07:00', '2019-01-01 08:00', '2019-01-01 09:00', '2019-01-01 10:00', '2019-01-01 11:00'], dtype='period[H]', freq='H') """
2、生成Timestamp對象及轉(zhuǎn)換
創(chuàng)建一個(gè)Timestamp時(shí)間戳對象有pd.Timestamp()方法和pd.to_datetime()方法。如下所示:
ts=pd.Timestamp(2019,1,1) print(f'pd.Timestamp()-1:{ts}') #pd.Timestamp()-1:2019-01-01 00:00:00 ts=pd.Timestamp(dt(2019,1,1,hour=0,minute=1,second=1)) print(f'pd.Timestamp()-2:{ts}') #pd.Timestamp()-2:2019-01-01 00:01:01 ts=pd.Timestamp("2019-1-1 0:1:1") print(f'pd.Timestamp()-3:{ts}') #pd.Timestamp()-3:2019-01-01 00:01:01 print(f'pd.Timestamp()-type:{type(ts)}') #pd.Timestamp()-type:<class 'pandas._libs.tslibs.timestamps.Timestamp'> #dt=pd.to_datetime(2019,1,1) 不支持 dt=pd.to_datetime(dt(2019,1,1,hour=0,minute=1,second=1)) print(f'pd.to_datetime()-1:{dt}') #pd.to_datetime()-1:2019-01-01 00:01:01 dt=pd.to_datetime("2019-1-1 0:1:1") print(f'pd.to_datetime()-2:{dt}') #pd.to_datetime()-2:2019-01-01 00:01:01 print(f'pd.to_datetime()-type:{type(dt)}') #pd.to_datetime()-type:<class 'pandas._libs.tslibs.timestamps.Timestamp'> #pd.to_datetime生成自定義時(shí)間序列 dtlist=pd.to_datetime(["2019-1-1 0:1:1", "2019-3-1 0:1:1"]) print(f'pd.to_datetime()-list:{dtlist}') #pd.to_datetime()-list:DatetimeIndex(['2019-01-01 00:01:01', '2019-03-01 00:01:01'], dtype='datetime64[ns]', freq=None) #時(shí)間戳轉(zhuǎn)換為period月時(shí)期 pr = ts.to_period('M') print(f'ts.to_period():{pr}') #ts.to_period():2019-01 print(f'pd.to_period()-type:{type(pr)}') #pd.to_period()-type:<class 'pandas._libs.tslibs.period.Period'>
3、生成period對象及轉(zhuǎn)換
#定義時(shí)期period per=pd.Period('2019') print(f'pd.Period():{per}') #pd.Period():2019 per_del=pd.Period('2019')-pd.Period('2018') print(f'2019和2018間隔{per_del}年')#可以直接+、-整數(shù)(代表年) #2019和2018間隔1年 #時(shí)期轉(zhuǎn)換為時(shí)間戳 print(per.to_timestamp(how='end'))#2019-12-31 00:00:00 print(per.to_timestamp(how='start'))#2019-01-01 00:00:00
4、生成時(shí)間間隔Timedelta
#生成時(shí)間間隔Timedelta print(pd.Timedelta(days=5, minutes=50, seconds=20, milliseconds=10, microseconds=10, nanoseconds=10)) #5 days 00:50:20.010010 #獲取當(dāng)前時(shí)間 now=pd.datetime.now() #計(jì)算當(dāng)前時(shí)間往后50天的日期 dt=now+pd.Timedelta(days=50) print(f'當(dāng)前時(shí)間是{now}, 50天后時(shí)間是{dt}') #當(dāng)前時(shí)間是2019-06-08 17:59:31.726065, 50天后時(shí)間是2019-07-28 17:59:31.726065 #只顯示年月日 print(dt.strftime('%Y-%m-%d'))#2019-07-28
5、重采樣及頻率轉(zhuǎn)換
#asfreq 按季度顯示索引值 #'DatetimeIndex' object has no attribute 'asfreq' date=pd.date_range('1/1/2018', periods=20, freq='D') tsdat_series=pd.Series(range(20),index=date) tsp_series=tsdat_series.to_period('D') print(tsp_series.index.asfreq('Q')) date=pd.period_range('1/1/2018', periods=20, freq='D') tsper_series=pd.Series(range(20),index=date) print(tsper_series.index.asfreq('Q')) """ PeriodIndex(['2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1', '2018Q1'], dtype='period[Q-DEC]', freq='Q-DEC') """ #resample 按季度統(tǒng)計(jì)并顯示 print(tsdat_series.resample('Q').sum().to_period('Q')) """ 2018Q1 190 Freq: Q-DEC, dtype: int64 """ #groupby 按周進(jìn)行匯總求平均值 print(tsdat_series.groupby(lambda x:x.weekday).mean()) """ 0 7.0 1 8.0 2 9.0 3 10.0 4 11.0 5 12.0 6 9.5 dtype: float64 """
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python學(xué)習(xí)之路安裝pycharm的教程詳解
pycharm 是一款功能強(qiáng)大的 Python 編輯器,具有跨平臺性。這篇文章主要介紹了Python學(xué)習(xí)之路安裝pycharm的教程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06python Django實(shí)戰(zhàn)之歌曲搜索功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用python Django實(shí)現(xiàn)歌曲搜索功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的小伙伴開業(yè)了解下2023-10-10Win10下python3.5和python2.7環(huán)境變量配置教程
這篇文章主要為大家詳細(xì)介紹了Win10下python3.5和python2.7環(huán)境變量配置教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09python實(shí)現(xiàn)自動清理重復(fù)文件
這篇文章主要介紹了python如何實(shí)現(xiàn)自動清理重復(fù)文件,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-08-08使用Python建立RNN實(shí)現(xiàn)二進(jìn)制加法的示例代碼
這篇文章主要介紹了使用Python建立RNN實(shí)現(xiàn)二進(jìn)制加法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python檢測數(shù)據(jù)類型的方法總結(jié)
在本篇文章里小編給大家整理了關(guān)于Python檢測數(shù)據(jù)類型的方法和相關(guān)實(shí)例代碼,需要的朋友們跟著學(xué)習(xí)下。2019-05-05關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解
今天小編就為大家分享一篇關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02