簡體   English   中英

如何在熊貓上切片Multindex時間序列數據幀?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM