0

おおよそ8ミリ秒ごとにデータを収集することによって作成されたパンダ(python)データフレームがいくつかあります。データはブロックに分割され、そこでシーケンスが再開されます。すべてのブロックにはラベルがあり、サンプルが収集された時刻 (ファイルの先頭から) を示すタイムスタンプ列があります。アイデアを得るために、フレームは次のようになります。

|        | EXPINDEX | EXPTIMESTAMP | DATA1 | DATA2 |
-----------------------------------------------------
| BLOCK  | 0        |              |       |       |
| Block1 | 1        | 0            | .423  | .926  |
|        | 2        | 8.215        | .462  | .919  |
|        | 3        | 17.003       | .472  | .904  |
| Block2 | 4        | 55.821       | .243  | .720  |
|        | 5        | 63.521       | .237  | .794  |
| ...    | ...      | ...          | ...   | ...   |
------------------------------------------------------

EXPTIMESTAMP 列は DateTimeIndex です。私がやりたいことは、後でユーティリティのためにその列を保持することですが、ブロック相対 DateTimeIndex を使用して別のサブインデックスを作成します。

|        |                | EXPTIMESTAMP | DATA1 | DATA2 |
----------------------------------------------------------
| BLOCK  | BLOCKTIMESTAMP |              |       |       |
| Block1 | 0              | 0            | .423  | .926  |
|        | 8.215          | 8.215        | .462  | .919  |
|        | 17.003         | 17.003       | .472  | .904  |
| Block2 | 0              | 55.821       | .243  | .720  |
|        | 7.700          | 63.521       | .237  | .794  |
| ...    | ...            | ...          | ...   | ...   |
----------------------------------------------------------

私はこれを機能させました:

blockreltimestamp = []
blocks = list(df.index.levels[0])
for block in blocks:
   dfblock = df.xs(block, level='BLOCK').copy()
   dfblock["InitialVal"] = dfblock.iloc[0]["EXPTIMESTAMP"]
   reltime = dfsblock["EXPTIMESTAMP"] - dfblock["InitialVal"]
   blockreltimestamp.extend(list(reltime))
df["BLOCKTIMESTAMP"] = blockreltimestamp
df.set_index(["BLOCK","BLOCKTIMESTAMP"], drop=False, inplace=True)

しかし、このタイプの変換を行うための、よりクリーン/より効率的/よりパンダ風の方法があるかどうか疑問に思っていました。

ありがとう!

4

1 に答える 1