2017-12-06 23 views
2

私のデータがどのように見える(データ型はパンダDATAFRAMEです):インデックスをすべてリサンプリングして最も近い秒に丸める方法は?

price = 

time    bid 
03:03:34.797000  116.02 
03:03:34.797000  116.02 
03:03:54.152000  116.02 
03:03:54.169000  116.02 
03:03:54.169000  116.02 
03:07:36.899000  116.24 
03:07:48.760000  116.24 
03:07:48.760000  116.24 
03:07:48.761000  116.24 

私は2番目のレベルのデータにデータをリサンプリングし、元の時間を超えない以前の最も近い秒にすべてのデータを合わせてみました。

03:04:00 116.02 
03:05:00 NaN 
03:06:00 NaN 
03:07:00 NaN 
03:08:00 116.24 

と私が得たしかし

price.resample('Min').last() 

を使用:私は結果があることを期待しています。

03:03:34.797000  116.02 
03:04:34.797000  NaN 
03:05:34.797000  NaN 
03:06:34.797000  NaN 
03:07:34.797000  116.24 

アラインメント以外はすべてうまく行きます。誰も私が問題を解決するのを助けることができますか?ありがとう。

df.groupby(df.index.floor('Min')).last().resample('Min').asfreq() 

のは、(0.21.0+パンダを必要とする)スピードを試してみましょう:

df.set_axis(df.index.floor('Min'), axis=0, inplace=False)\ 
    .drop_duplicates().resample('Min').asfreq() 

出力:あなたはfloorを使用する必要が

答えて

1

   bid 
time    
03:03:00 116.02 
03:04:00  NaN 
03:05:00  NaN 
03:06:00  NaN 
03:07:00 116.24 
+0

ありがとうございました。しかし、グループバイは遅くなる可能性がありますか?私は約500Mの行のためにこれを実行する必要があります、これを行うための迅速な方法はありますか? – MTANG

+0

@MTANG groupbyを使用しない別のソリューションを追加しました。この小さなデータセットで速度の向上が見られます。 –

+0

ありがとうございました。 – MTANG

1
(df.groupby(df['time'].dt.round('1min'))['bid'].mean()).asfreq('Min') 
Out[45]: 
time 
2017-12-06 03:04:00 116.02 
2017-12-06 03:05:00  NaN 
2017-12-06 03:06:00  NaN 
2017-12-06 03:07:00  NaN 
2017-12-06 03:08:00 116.24 
Freq: T, Name: bid, dtype: float64 
1

私はこのソリューションで試して、それはより速く実行されます。

df = df.resample('Min').last() 
offset_mc = df.index[0].microseconds 
offset_sec = df.index[0].seconds % 60 
if not (offset_mc == 0 and offset_sec == 0): df.index += pd.tslib.Timedelta(str(59-offset_sec)+'seconds '+str(1000000-offset_mc)+'microseconds') 
関連する問題