2017-12-02 23 views
1

パンダの新人はこちらパンダのデータフレームms値の再サンプリング

Iは、次の形式のファイルを有する:5列

SET, 0, 0, 0, 6938987, 0, 4 
SET, 1, 1, 6938997, 128, 0, 0 
SET, 2, 4, 6938998, 145, 0, 2 
SET, 0, 9, 6938998, 147, 0, 0 
SET, 1, 11, 6938998, 149, 0, 0 
.... 
SET, 1, 30, 6946103, 6, 0, 0 
SET, 2, 30, 6946104, 6, 0, 2 
GET, 0, 30, 6946104, 8, 0, 0 
SET, 1, 30, 6946105, 8, 0, 0 
GET, 2, 30, 6946106, 7, 0, 0 

は、私は(JavaのSystem.nanoTimeの()から変換された)システムから測定MSを表します。したがって、これらは日付/時刻形式を表すものではありません。私は5秒の間隔で集計したい、例えば最初の6938987から6943987まで:SET/GETの値の数を取得し、平均、標準偏差などを得る。

私はさまざまな方法でdata.resampleを使用してみましたが、 次のエラーを取得し続けてきました:

data = pd.read_csv('data2.log', sep=", ", header=None) 
data.columns = ["command", "server", "lenQueue", "inQueue", "diffQueue", "diffParse", "diffProcess"] 
r = data.resample("5ms", on='inQueue') 



TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index' 

代わりに、時系列の値の差をもってリサンプルを行うための任意の方法を?

編集 - ヨーネによって提案された解決策:その後、5msのにリサンプリングはtimedeltaで

転換MS、:必見はまた、いくつかを持っている他の列があるので

data['td'] = pd.to_timedelta(data['inQueue'], 'ms') 
data['sum'] = data.set_index(data['td'])['lenQueue'].resample('5ms').sum() 

[Other columns ommitted] 
        td sum 
0   00:00:00 NaN 
1  01:55:38.997000 NaN 
2  01:55:38.998000 NaN 
3  01:55:38.998000 NaN 
4  01:55:38.998000 NaN 
5  01:55:38.998000 NaN 
6  01:55:38.999000 NaN 

それができます彼らに集約されましたか?もしそうなら、私はそれを何回もやり直すことができますか?

答えて

0

エラーメッセージは、datetime形式の形式に変換する必要があることを示しています。

タイムスタンプではなく、timedeltaに変換するのが簡単な方法ですが、これは次のように行うことができます。 (ミリ秒)、「MS」にはtimedeltaを表す新しいコラム「TD」を作る次に

In [143]: df 
Out[143]: 
    val  ms  
0 11 6938987 
1 22 6938997 
2 33 6938998 

:最初のは、あなたのデータの簡単なバージョンを使用してみましょう。 (マイクロ秒が必要な場合は、代わりに「us」を使用してください)。

In [144]: df['td'] = pd.to_timedelta(df['ms'],'ms') 

In [145]: df 
Out[145]: 
    val  ms    td 
0 11 6938987 01:55:38.987000 
1 22 6938997 01:55:38.997000 
2 33 6938998 01:55:38.998000 

次に簡単にresampleを使用できます。いくつかの操作(たとえば、合計、最大、平均など)で再サンプリングする必要があることに注意してください。ここで私は合計で行くでしょう:

In [146]: df.set_index(df['td'])['val'].resample('5ms').sum() 
Out[146]: 
td 
01:55:38.987000 11.0 
01:55:38.992000  NaN 
01:55:38.997000 55.0 
Freq: 5L, Name: val, dtype: float64 
+0

それは感謝します、ありがとう!私は自分のデータセットで動作させようとしましたが、集計結果としてNaNを取得するだけです。私は元の投稿を更新しました。ご覧いただきありがとうございました。 – dtam

+0

@dtamは頻度だけかもしれませんか? '5'のような大きな値を試してみてください。ナノはちょうど与えられた間隔に値がないということだけです。 – JohnE

+0

私は大きな間隔で試しましたが、同じ問題があります。私はあなたの例に戻って、次の行を試して結果の新しい「合計」列を得ました: df ['sum'] = df.set_index(df ['td'])['lenQueue']。 ( '5ms')。sum() これもすべてのNaNを返します。 – dtam

関連する問題