2013-05-15 151 views
2

我有一個熊貓數據框,df1,這是一年的5分鐘列A-Z的時間序列。熊貓:花式索引數據框

df1.shape 
(105121, 26) 
df1.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-02 00:00:00] 
Length: 105121, Freq: 5T, Timezone: None 

我有第二個數據幀,DF2,這是一個長達一年的每天時間序列(較上年同期)相匹配的列。第二幀的值是布爾值。

df2.shape 
(365, 26) 
df2.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-01 00:00:00] 
Length: 365, Freq: D, Timezone: None 

我想用DF2作爲一個奇特的指數DF1,即「df1.ix [DF2]」或諸如此類,這樣我回去每個日期DF1的列的子集 - 即那些DF2在當天說是真的(所有的時間戳都在其上)。因此,結果的形狀應該是(105121,寬度),其中寬度是布爾人暗示的不同列數(寬度< = 26)。

目前,df1.ix [df2]僅部分工作。只有每天的00:00值被挑選出來,這對於df2的「點狀」時間序列來說是有意義的。

我明年受審的時間跨度爲DF2指數:

df2.index 
PeriodIndex: 365 entries, 2002-01-02 to 2003-01-01 

這一次,我得到一個錯誤:

/home/wchapman/.local/lib/python2.7/site-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/index.pyc in get_indexer(self, target, method, limit) 
    844    this = self.astype(object) 
    845    target = target.astype(object) 
--> 846    return this.get_indexer(target, method=method, limit=limit) 
    847 
    848   if not self.is_unique: 

AttributeError: 'numpy.ndarray' object has no attribute 'get_indexer' 

我的臨時解決方案是按日期循環,但這似乎效率不高。熊貓是否有這種奇特的索引?我沒有看到文檔中任何地方的例子。

+0

你可以重新取樣'df2'至5分鐘,並填寫它。 – joris

+0

謝謝 - 應該提到我也嘗試過。得到ValueError:無法用多維鍵索引。 – Will

回答

0

下面是做到這一點的一種方法:

t_index = df1.index 
d_index = df2.index 
mask = t_index.map(lambda t: t.date() in d_index) 
df1[mask] 

稍微快(但具有相同的想法)是使用:

mask = pd.to_datetime([datetime.date(*t_tuple) 
          for t_tuple in zip(t_index.year, 
               t_index.month, 
               t_index.day)]).isin(d_index) 
+0

'.date'對於DatetimeIndex可能是一個有用的方法(我想我會把它放在一起)。 –

+0

添加爲[拉取請求](https://github.com/pydata/pandas/pull/3614)。 :) –

+0

謝謝安迪,但我的問題有點複雜。我需要使用df2的(布爾)_values_而不是索引作爲df1的花式索引,如下所示(numpy): a = np.arange(5) b = np.asarray([True 。False,True,False,True]) a [b] ---> arrray([0,2,4])。 碰巧,上面的代碼拉回了整個df1,因爲df1的日期時間都在df2的日子裏面。我需要的是返回df1的正確_columns_,即在相應的df2列中由True值標識的那些_columns_。而這個選擇會每天都有所不同。 – Will