[英]How do I slice a Multindex timeseries dataframe on Pandas?
我必須切片此代碼創建的數據框
data = pd.read_csv(("/user_home/w_hugopires/dados/dados_meteo.csv"),names=['POM','DTM','RNF','WET','HMD','TMP','DEW','INF'])
data['DTM'] = pd.to_datetime(data['DTM'], coerce = True)
data.set_index(['POM', 'DTM'], inplace=True)
首先,我必須創建一個Multindex,因為在幾個POM(自動氣象站)之間重復了DTM(時間戳)。
結果是
RNF WET HMD TMP DEW INF
POM DTM
QuintaVilar 2011-11-01 00:00:00 0 0 0 0 0 0
2011-11-01 00:15:00 0 0 0 0 0 0
2011-11-01 00:30:00 0 0 0 0 0 0
2011-11-01 00:45:00 0 0 0 0 0 0
2011-11-01 01:00:00 0 0 0 0 0 0
然后,我使用以下代碼創建數據框的一部分
intervalo = data[['TMP','RNF']].ix[pom1][start_year + start_month + start_day : final_year + final_month + final_day]
結果是
TMP RNF
DTM
2013-04-01 00:12:00 12.5 0
2013-04-01 00:27:00 12.1 0
2013-04-01 00:42:00 12.1 0
2013-04-01 00:57:00 11.7 0
2013-04-01 01:12:00 11.7 0
如何分割多個POM,如何分割多個時間間隔(例如,每年的四月)?
謝謝
雨果
示例數據框:
In [4]: data = pd.DataFrame(np.zeros((15,3)), columns=['RNF', 'WET', 'HMD'])
...: data['DTM'] = pd.date_range('2012-01-01', periods=5, freq='D').tolist()*3
...: data['POM'] = ['station1']*5 + ['station2']*5 + ['station3']*5
...: data = data.set_index(['POM', 'DTM'])
In [5]: data
Out[5]:
RNF WET HMD
POM DTM
station1 2012-01-01 0 0 0
2012-01-02 0 0 0
2012-01-03 0 0 0
2012-01-04 0 0 0
2012-01-05 0 0 0
station2 2012-01-01 0 0 0
2012-01-02 0 0 0
2012-01-03 0 0 0
2012-01-04 0 0 0
2012-01-05 0 0 0
station3 2012-01-01 0 0 0
2012-01-02 0 0 0
2012-01-03 0 0 0
2012-01-04 0 0 0
2012-01-05 0 0 0
1.如何切片多個POM?
要僅對第一層進行切片,可以提供一個列表(例如data.loc[['station1', 'station2']]
)或僅進行切片(例如data.loc['station1':'station3']
)假設您的意思是當在第一級中選擇了多個元素時如何切片第二級?
借助0.14版中的新的多索引功能(請參閱whatsnew docs ),只需切片第二層即可輕松實現:
In [8]: idx = pd.IndexSlice
In [9]: data.loc[idx[['station1', 'station2'], '2012-01-02':'2012-01-04'], :]
Out[9]:
RNF WET HMD
POM DTM
station1 2012-01-02 0 0 0
2012-01-03 0 0 0
2012-01-04 0 0 0
station2 2012-01-02 0 0 0
2012-01-03 0 0 0
2012-01-04 0 0 0
這相當於
data.loc[(['station1', 'station2'], slice('2012-01-02','2012-01-04')), :]
但是提供了pd.IndexSlice
作為不需要執行slice(...)
如果您沒有pandas版本0.14 ,那么另一種方法是取消數據框的堆疊(將“ stations”索引級別移動到列):
In [12]: data2 = data.unstack(level=0).reorder_levels([1,0], axis=1).sort_index(axis=1)
In [13]: data2
Out[13]:
POM station1 station2 station3
RNF WET HMD RNF WET HMD RNF WET HMD
DTM
2012-01-01 0 0 0 0 0 0 0 0 0
2012-01-02 0 0 0 0 0 0 0 0 0
2012-01-03 0 0 0 0 0 0 0 0 0
2012-01-04 0 0 0 0 0 0 0 0 0
2012-01-05 0 0 0 0 0 0 0 0 0
然后您可以輕松地在行上切片:
data2['2012-01-02':'2012-01-04']
如果要以原始形式返回它,則必須將其stack
回去( reorder_levels
需要reorder_levels
是因為stack
reorder_levels
“ stations”插入現有行索引之后,而我們希望將其作為行索引的第一層):
data2['2012-01-02':'2012-01-04'].stack(0).reorder_levels([1,0], axis=0).sort_index(axis=0)
2.如何分割多個時間間隔(例如每年的每年四月)?
您可以例如使用布爾索引進行此操作。 以獲取第2天和第4天的示例為例:
In [22]: time_index = data.index.get_level_values(1)
In [23]: selection = (time_index.day == 2) | (time_index.day == 4)
In [24]: data[selection]
Out[24]:
RNF WET HMD
POM DTM
station1 2012-01-02 0 0 0
2012-01-04 0 0 0
station2 2012-01-02 0 0 0
2012-01-04 0 0 0
station3 2012-01-02 0 0 0
2012-01-04 0 0 0
在您的情況下(例如,獲取每年的每年四月),這將是data[time_index.month == 4]
。
在這種情況下,將其與第一級(站點)的多個選擇結合起來比較困難,但是您可以例如在此布爾索引之后執行此操作,或者可以在“未堆疊”的數據幀上進行此操作(請參見上面的示例data2
)。
您可能需要考慮的其他事項。 我個人認為,根據您的應用程序,將不同的工作站存儲在您的列索引中而不是行中(這樣具有列多索引)會更方便,如data2
所示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.