python+pandas生成指定日期和重采樣的方法
python 日期的范圍、頻率、重采樣以及頻率轉(zhuǎn)換
pandas有一整套的標(biāo)準(zhǔn)時(shí)間序列頻率以及用于重采樣、頻率推斷、生成固定頻率日期范圍的工具。
生成指定日期范圍的范圍
pandas.date_range()用于生成指定長(zhǎng)度的DatatimeIndex:
1)默認(rèn)情況下,date_range會(huì)按著時(shí)間間隔為天的方式生成從給定開(kāi)始到結(jié)束時(shí)間的時(shí)間戳數(shù)組;
2)如果只指定開(kāi)始或結(jié)束時(shí)間,還需要periods標(biāo)定時(shí)間長(zhǎng)度。
import pandas as pd
pd.date_range('2017-6-20','2017-6-27')
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23', '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'], dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30','2017-6-27')
DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30', '2017-06-22 12:59:30', '2017-06-23 12:59:30', '2017-06-24 12:59:30', '2017-06-25 12:59:30', '2017-06-26 12:59:30'], dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8)
DatetimeIndex(['2017-06-20 12:59:30', '2017-06-21 12:59:30', '2017-06-22 12:59:30', '2017-06-23 12:59:30', '2017-06-24 12:59:30', '2017-06-25 12:59:30', '2017-06-26 12:59:30', '2017-06-27 12:59:30'], dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-20 12:59:30',periods = 8, normalize = True)
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23', '2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'], dtype='datetime64[ns]', freq='D')
頻率和日期偏移量
pandas中的頻率是由一個(gè)基礎(chǔ)頻率(M、H)也可以是(Hour、Minute、h、min等)
pd.date_range('2017-6-27',periods = 7,freq = '1h30min')
DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:30:00', '2017-06-27 03:00:00', '2017-06-27 04:30:00', '2017-06-27 06:00:00', '2017-06-27 07:30:00', '2017-06-27 09:00:00'], dtype='datetime64[ns]', freq='90T')
pd.date_range('2017-6-27',periods = 7,freq = 'M')
DatetimeIndex(['2017-06-30', '2017-07-31', '2017-08-31', '2017-09-30', '2017-10-31', '2017-11-30', '2017-12-31'], dtype='datetime64[ns]', freq='M')
pd.date_range('2017-6-27',periods = 7,freq = 'd')
DatetimeIndex(['2017-06-27', '2017-06-28', '2017-06-29', '2017-06-30', '2017-07-01', '2017-07-02', '2017-07-03'], dtype='datetime64[ns]', freq='D')
pd.date_range('2017-6-27',periods = 7,freq = 'H')
DatetimeIndex(['2017-06-27 00:00:00', '2017-06-27 01:00:00', '2017-06-27 02:00:00', '2017-06-27 03:00:00', '2017-06-27 04:00:00', '2017-06-27 05:00:00', '2017-06-27 06:00:00'], dtype='datetime64[ns]', freq='H')
常用的基礎(chǔ)頻率
| 別名 | 偏移量 | 說(shuō)明 |
|---|---|---|
| D/d | Day | 每日歷日 |
| B | BusinessDay | 每工作日 |
| H/h | Hour | 每小時(shí) |
| T或min | Minute | 每分 |
| S | Secend | 每秒 |
| L或ms | Milli | 每毫秒(每千分之一秒) |
| U | Micro | 每微秒(即百萬(wàn)分之一秒) |
| M | MonthEnd | 每月最后一個(gè)日歷日 |
| BM | BusinessDayEnd | 每月最后一個(gè)工作 |
上表只展示了部分!
WOM日期(可獲得例如“每月第3個(gè)星期五”)
pd.date_range('2017-06-01','2017-07-31',freq='WOM-3FRI')
DatetimeIndex(['2017-06-16', '2017-07-21'], dtype='datetime64[ns]', freq='WOM-3FRI')
重采樣及頻率轉(zhuǎn)換
降采樣:高頻數(shù)據(jù)到低頻數(shù)據(jù)
升采樣:低頻數(shù)據(jù)到高頻數(shù)據(jù)
主要函數(shù):resample()(pandas對(duì)象都會(huì)有這個(gè)方法)
resample方法的參數(shù)
| 參數(shù) | 說(shuō)明 |
|---|---|
| freq | 表示重采樣頻率,例如‘M'、‘5min',Second(15) |
| how='mean' | 用于產(chǎn)生聚合值的函數(shù)名或數(shù)組函數(shù),例如‘mean'、‘ohlc'、np.max等,默認(rèn)是‘mean',其他常用的值由:‘first'、‘last'、‘median'、‘max'、‘min' |
| axis=0 | 默認(rèn)是縱軸,橫軸設(shè)置axis=1 |
| fill_method = None | 升采樣時(shí)如何插值,比如‘ffill'、‘bfill'等 |
| closed = ‘right' | 在降采樣時(shí),各時(shí)間段的哪一段是閉合的,‘right'或‘left',默認(rèn)‘right' |
| label= ‘right' | 在降采樣時(shí),如何設(shè)置聚合值的標(biāo)簽,例如,9:30-9:35會(huì)被標(biāo)記成9:30還是9:35,默認(rèn)9:35 |
| loffset = None | 面元標(biāo)簽的時(shí)間校正值,比如‘-1s'或Second(-1)用于將聚合標(biāo)簽調(diào)早1秒 |
| limit=None | 在向前或向后填充時(shí),允許填充的最大時(shí)期數(shù) |
| kind = None | 聚合到時(shí)期(‘period')或時(shí)間戳(‘timestamp'),默認(rèn)聚合到時(shí)間序列的索引類(lèi)型 |
| convention = None | 當(dāng)重采樣時(shí)期時(shí),將低頻率轉(zhuǎn)換到高頻率所采用的約定(start或end)。默認(rèn)‘end' |
降采樣
需考慮:
1)各區(qū)間哪邊是閉合的(參數(shù):closed)
2)如何標(biāo)記各聚合面元,用區(qū)間的開(kāi)頭還是末尾(參數(shù):label)
ts_index = pd.date_range('2017-06-20',periods =12,freq = '1min')#一分鐘采樣數(shù)據(jù)
ts = pd.Series(np.arange(12),index = ts_index)
ts
2017-06-20 00:00:00 0 2017-06-20 00:01:00 1 2017-06-20 00:02:00 2 2017-06-20 00:03:00 3 2017-06-20 00:04:00 4 2017-06-20 00:05:00 5 2017-06-20 00:06:00 6 2017-06-20 00:07:00 7 2017-06-20 00:08:00 8 2017-06-20 00:09:00 9 2017-06-20 00:10:00 10 2017-06-20 00:11:00 11 Freq: T, dtype: int32
聚合到5分鐘
ts.resample('5min',how='sum')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated the new syntax is .resample(...).sum() if __name__ == '__main__': 2017-06-20 00:00:00 10 2017-06-20 00:05:00 35 2017-06-20 00:10:00 21 Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated the new syntax is .resample(...).sum() if __name__ == '__main__': 2017-06-20 00:00:00 10 2017-06-20 00:05:00 35 2017-06-20 00:10:00 21 Freq: 5T, dtype: int32
ts.resample('5min',how='sum',closed='left',label ='left')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: how in .resample() is deprecated the new syntax is .resample(...).sum() if __name__ == '__main__': 2017-06-20 00:00:00 10 2017-06-20 00:05:00 35 2017-06-20 00:10:00 21 Freq: 5T, dtype: int32
通過(guò)groupby進(jìn)行重插樣
另外一種降采樣方法
ts1_index = pd.date_range('2017-6-01',periods = 100,freq = 'd')
ts1 = pd.Series(np.arange(100),index = ts1_index)
ts1.head()
2017-06-01 0 2017-06-02 1 2017-06-03 2 2017-06-04 3 2017-06-05 4 Freq: D, dtype: int32
ts1.groupby(lambda x:x.month).mean()
6 14.5 7 45.0 8 76.0 9 95.5 dtype: float64
ts1.groupby(lambda x:x.weekday).mean()
0 49.5 1 50.5 2 51.5 3 49.0 4 50.0 5 47.5 6 48.5 dtype: float64
df1 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index)
df1.groupby(lambda x:x.weekday).mean()
| 0 | 1 | |
|---|---|---|
| 0 | 99 | 100 |
| 1 | 101 | 102 |
| 2 | 103 | 104 |
| 3 | 98 | 99 |
| 4 | 100 | 101 |
| 5 | 95 | 96 |
| 6 | 97 | 98 |
對(duì)于具有時(shí)間序列索引的pandas數(shù)據(jù)結(jié)構(gòu),當(dāng)groupby傳入一個(gè)函數(shù)時(shí),可以對(duì)時(shí)間索引對(duì)應(yīng)列進(jìn)行聚合
升采樣
升采樣沒(méi)有聚合,但是需要填充
df2 = pd.DataFrame(np.arange(200).reshape(100,2),index = ts1_index,columns=['add1','add2']) df2.head()
| add1 | add2 | |
|---|---|---|
| 2017-06-01 | 0 | 1 |
| 2017-06-02 | 2 | 3 |
| 2017-06-03 | 4 | 5 |
| 2017-06-04 | 6 | 7 |
| 2017-06-05 | 8 | 9 |
df2.resample('W-THU',fill_method = 'ffill')
C:\Program Files\anaconda\lib\site-packages\ipykernel\__main__.py:1: FutureWarning: fill_method is deprecated to .resample() the new syntax is .resample(...).ffill() if __name__ == '__main__':
| add1 | add2 | |
|---|---|---|
| 2017-06-01 | 0 | 1 |
| 2017-06-08 | 14 | 15 |
| 2017-06-15 | 28 | 29 |
| 2017-06-22 | 42 | 43 |
| 2017-06-29 | 56 | 57 |
| 2017-07-06 | 70 | 71 |
| 2017-07-13 | 84 | 85 |
| 2017-07-20 | 98 | 99 |
| 2017-07-27 | 112 | 113 |
| 2017-08-03 | 126 | 127 |
| 2017-08-10 | 140 | 141 |
| 2017-08-17 | 154 | 155 |
| 2017-08-24 | 168 | 169 |
| 2017-08-31 | 182 | 183 |
| 2017-09-07 | 196 | 197 |
| 2017-09-14 | 198 | 199 |
總結(jié)
本篇博客主要內(nèi)容:
1)生成指定時(shí)間段,指定頻率的日期
2)對(duì)含有時(shí)間索引的pandas數(shù)據(jù)進(jìn)行重采樣,包括降采樣和升采樣等。
相關(guān)文章
關(guān)于Python如何安裝requests庫(kù)
這篇文章主要介紹了關(guān)于Python如何安裝requests庫(kù),requests庫(kù)自稱(chēng)“HTTP for Humans”,直譯過(guò)來(lái)的意思是專(zhuān)門(mén)為人類(lèi)設(shè)計(jì)的HTTP庫(kù),能夠被開(kāi)發(fā)人員安全地使用,需要的朋友可以參考下2023-04-04
ptyhon實(shí)現(xiàn)sitemap生成示例
這篇文章主要介紹了ptyhon實(shí)現(xiàn)sitemap生成示例,需要的朋友可以參考下2014-03-03
OpenCV基于ORB算法實(shí)現(xiàn)角點(diǎn)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了OpenCV基于ORB算法實(shí)現(xiàn)角點(diǎn)檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Python實(shí)現(xiàn)刪除列表首元素的多種方式總結(jié)
在Python中,處理列表的操作是日常開(kāi)發(fā)中不可避免的任務(wù)之一,其中,刪除列表中的元素是一個(gè)常見(jiàn)的需求,本文為大家整理了Python中刪除列表中的第一個(gè)元素的多種方法,需要的可以參考下2023-12-12
python的列表生成式,生成器和generator對(duì)象你了解嗎
這篇文章主要為大家詳細(xì)介紹了python的列表生成式,生成器和generator對(duì)象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
Python+random模塊實(shí)現(xiàn)隨機(jī)抽樣
python的random庫(kù),提供了很多隨機(jī)抽樣方法。本文將通過(guò)幾個(gè)示例為大家詳細(xì)講講random模塊實(shí)現(xiàn)隨機(jī)抽樣的方法,需要的可以參考一下2022-09-09
Python使用kombu連接信息中包含#號(hào)問(wèn)題排查方式
文章描述了在部署Python項(xiàng)目到生產(chǎn)環(huán)境時(shí)遇到的一個(gè)錯(cuò)誤,即端口號(hào)無(wú)法正確轉(zhuǎn)換為整數(shù)值,該錯(cuò)誤在測(cè)試環(huán)境和本地調(diào)試中沒(méi)有出現(xiàn),但在生產(chǎn)環(huán)境中才出現(xiàn),通過(guò)分析錯(cuò)誤信息和代碼,作者發(fā)現(xiàn)問(wèn)題出在URL解析過(guò)程中,特別是在處理包含特殊字符(如#號(hào))的URL時(shí)2024-12-12

