おおよそ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)
しかし、このタイプの変換を行うための、よりクリーン/より効率的/よりパンダ風の方法があるかどうか疑問に思っていました。
ありがとう!