2016-10-25 6 views
1

ファイルに格納されている温度エントリを読み取っています。 温度値が変化すると各エントリが生成されるため、一定の間隔で格納されません。次のようにインデックスエントリ間のインデックス値を使用してデータフレームを照会

データの例は次のようになります。

timestamp | temperature 
-----------+------------ 
1477400000 | 31 
1477400001 | 31.5 
1477400003 | 32 
1477400010 | 31.5 
1477400200 | 32 
1477400201 | 32.5 

私はそれがインデックスでない場合でも、任意のタイムスタンプで温度を取得するために高速な方法が必要になります。たとえば、1477400002の温度は31.5になりますが、1477400002はインデックスには含まれません。

次のように簡単に再現性のために、同じデータフレームが生成されることがあります。

df = pd.DataFrame(data={'temperature': [31, 31.5, 32, 31.5, 32, 32.5]}, 
        index=[1477400000, 1477400001, 1477400003, 1477400010, 1477400200, 1477400201]) 
+1

なぜそれが '返す31.5'ではなく' 32'必要がありますか? – EdChum

+0

@kiril、あなたのmcveに示されているようにインデックスの値が繰り返されますか? –

+0

タイムスタンプの前に値32が設定されているため、31.5が返される – kiril

答えて

2

は、インデックスがソートされると仮定すると、あなたは順序位置を返すようにnp.searchsortedを使用し、DFにインデックスにilocを使用することができます:

In [84]: 
df.iloc[max(0, np.searchsorted(df.index, 1477400002) -1)] 

Out[84]: 
temperature 31.5 
Name: 1477400001, dtype: float64 

ここで私はそれが私もmaxをカルク最初のエントリを返す状況から保護するために追加的に、下限を返すようにnp.searchsortedの結果から1を減算0と返された値の間にあなたが1477400000を見つけることを試みた場合、これはまだあなたはまたindex.get_locメソッドを使用して に引数だnearest=padそれを設定することができ、最初のエントリ

2

を返しますので、一致が見つからない場合はケース内の前のインデックス値を見つけます。次に、図に示すように、name属性と関心、温度の列にアクセスすることにより、前述の操作で指示されたインデックスに値を取得するためにDF.get_valueを使用します。

デモ:

df.get_value(df.iloc[df.index.get_loc(1477400002, method='pad')].name, 'temperature') 
# 31.5 

df.get_value(df.iloc[df.index.get_loc(1477400003, method='pad')].name, 'temperature') 
# 32.0 

ことがあります与えられた特定の時点で以前の値を望むように、最初のインデックスの後にクエリが開始されると仮定します。

タイミング:

%timeit df.get_value(df.iloc[df.index.get_loc(1477400002, method='pad')].name, 'temperature') 
1000 loops, best of 3: 164 µs per loop 
+0

タイミングを追加できますか? – jezrael

+0

ええ、私はそれを追加しました。しかし、EdChumの答えは鉱山に比べて2倍速いですが、クエリにすでにマッチが含まれている場合は以前の結果が得られますが、鉱山は同じ値を返します。 –

+0

残念ながら、このキーでは失敗します。 'print(df.get_value(df.iloc [df.index.get_loc(1477300999、method = 'pad')]。name、 'temperature')) ' – jezrael

関連する問題