2016-10-14 1 views
1

pandas.DatetimeIndexからpandas.DataFrame.between_timeを使用してデータを選択できることはわかっています。 pandasに2回の除外方法がありますか?パンダの時間を除外する

たとえば、16:00から17:00の間にデータを除外するには、現在次のようにしています。

In [1]: import pandas as pd 
     import numpy as np 

In [2]: df = pd.DataFrame(np.random.randn(24 * 60 + 1, 2), columns=list("AB"), index=pd.date_range(start="20161013 00:00:00", freq="1T", periods=24 * 60 +1)) 

In [3]: idx = df.index.hour == 16 

In [4]: df = df[~idx] 

In [5]: df.between_time("16:00", "17:00") 
Out[5]: 
          A   B 
2016-10-13 17:00:00 -0.745892 1.832912 

EDIT

私はこれを使用することができました:

In[41]:df2 = df.ix[np.setdiff1d(df.index, df.between_time("16:00", "17:00").index)] 


In[42]:df2.between_time("15:59", "17:01") 
Out[42]: 
          A   B 
2016-10-13 15:59:00 1.190678 0.783776 
2016-10-13 17:01:00 -0.590931 -1.059962 

は、より良い方法はありますか?

+0

バグのように聞こえます – Boud

答えて

3

あなたはdropbetween_timeを組み合わせることができます

df2 = df.drop(df.between_time("16:00", "17:00").index) 

編集

別の方法はbetween_timeを円に動作するという事実を利用することであるので、あなたの入力順を切り替えることができますそれらの範囲を除外する時間:

df.between_time("17:00", "16:00", include_start=False, include_end=False) 
+0

ニース!どうもありがとう! –

-1
df['hour'] = df.index.hour 
df[(df['hour'] < 16) | (df['hour'] > 17)] 
+0

私たちはこれを行うことができると私は理解しています。df.ix [(df.index.hour> 16)| (df.index.hour <17)] 'でも、余分な列を使用せずに、私は任意の2つの時間の間に一般的な解決策を探しています。これは、16:23と16:53:52のようなデータを除外したい場合、分解します。 –

+0

私は元々そこにあった特定の問題に答えましたが、あなたは正しいです。フィルタリングを行うためのカスタム関数を作成することができます。タイムスタンプ、開始時刻、終了時刻をとり、タイムスタンプがそのウィンドウの外にあるときは常にTrueを返す 'filtWithin'という関数を考えてみましょう。次に、これを行うことができます 'df.apply(lambda x:filtWithin(x.index、12、startTime、endTime)、axis = 1)]' – David

関連する問題