1

不適切に保存されたいくつかの時系列データを変更しています。

ほとんど 15 分ごとのタイム スタンプを持つインデックスを作成した列がありますが、それよりも短いものもあります。行が間隔のどの部分であるかを示す列もstart_secあり ます。end_sec

問題は、データ作成者が時間間隔がすべて 15 分の長さであると想定しているためstart_sec end_sec、実際の間隔の長さに関係なく、すべての値が 0 から 900 (疑似秒) になることです。これらの列を開始時間 (インデックス) と実際の秒数に結合したいと思います。

物事を再スケーリングするための私の非常に厄介な解決策は、短い間隔のタイムスタンプのリストを生成し、すべてを for ループに入れることでした

for i in short_intervals:
    scale = float(df[ (df.index == i) ].delta.max()) / 60. / 15.
    df[ (df.index == i) ].start_sec = df[(df.index == i)].start_sec * scale
    df[ (df.index == i) ].end_sec = df[(df.index == i)].end_sec * scale

df.index == i与えられたタイムスタンプに関連する行のセットを選択する場所
df.delta.max()は、間隔の実際の長さを分単位で持ちます(物事の保存方法のため)
scale実際の秒数を取得するために疑似秒数をスケーリングしたい値を与えます。

それはすべて正常に機能し、完了したと思いましたが、

df[ (df.index == i) ].start_sec = df[(df.index == i)].start_sec * scale

実際には DataFrame を更新しません。df はループ後も前とまったく同じです。

4

1 に答える 1

0

df.index構文を使用する代わりに、これを試してください。

df.start_sec[i] = df.start_sec[i] * scale
df.end_sec[i] = df.end_sec[i] * scale

あるいは:

df.start_sec[i] *= scale
df.end_sec[i] *= scale

私のテストでは、フレームは次の構文で値を割り当てていません。

df[(df.index==i)].start_sec = 25

他の誰かがおそらく理由を説明できますが、おそらくこれと関係があります。

>>> type(df.A[i])
<type 'numpy.int64'>
>>> type(df[(df.index==i)].A)
<class 'pandas.core.series.Series'>
于 2013-11-14T01:46:27.150 に答える