pythonを使ってログデータの解析をしています。
以下のような操作を行いたいのですが、どうすればいいのかわかりませんでした。
助けていただきたいです。
python
1df = pd.DataFrame({ 'id' : ["id_1","id_1","id_2","id_3"], 2 'time' : pd.Timestamp('20130102'), 3 'number' : np.array([3] * 4,dtype='int32'), 4 'norimono' : pd.Categorical(["test","train","test","train"])}) 5 6 id time number norimono 70 id_1 2018-11-21 22:54:54 3 test 81 id_1 2018-11-21 22:54:55 3 train 92 id_2 2018-11-21 22:54:59 3 test 103 id_2 2018-11-21 22:55:59 3 train 114 id_2 2018-11-21 22:56:00 3 test 125 id_2 2018-11-21 22:56:55 3 test 136 id_3 2018-11-21 22:54:54 3 train
このようなデータがあったとします。
やりたいことは、idごとに次のログデータまでのtimeの差分を秒単位で新しい列として追加したいです。
python
1df["time2"] = df[["id","time"]].groupby("id").diff(-1) 2df["time2"] = pd.to_datetime(df["time2"])
現在このように処理をしているのですが、このようなコードで実行すると
python
1 id time number norimono time2 20 id_1 2018-11-21 22:54:54 3 test 1969-12-31 23:59:59 31 id_1 2018-11-21 22:54:55 3 train 1969-12-31 23:59:56 42 id_2 2018-11-21 22:54:59 3 test 1970-01-01 00:00:00 53 id_2 2018-11-21 22:55:59 3 train 1969-12-31 23:59:59 64 id_2 2018-11-21 22:56:00 3 test 1969-12-31 23:59:05 75 id_2 2018-11-21 22:56:55 3 test 1969-12-31 23:59:59 86 id_3 2018-11-21 22:57:54 3 train NaT
このようなdfが出力されます。しかし、この差分である秒数である以下のようなデータフレームを得たいと考えています。
python
1 id time number norimono time2 20 id_1 2018-11-21 22:54:54 3 test 1.0 31 id_1 2018-11-21 22:54:55 3 train 0.0 42 id_2 2018-11-21 22:54:59 3 test 60.0 53 id_2 2018-11-21 22:55:59 3 train 1.0 64 id_2 2018-11-21 22:56:00 3 test 55.0 75 id_2 2018-11-21 22:56:55 3 test 0.0 86 id_3 2018-11-21 22:54:54 3 train NaT
また、24:00:00からの差分と考えて、
86400 - (df["time2"].dt.hour3600+df["time2"].dt.minute60+df["time2"].dt.second)
のようにしようとも考えましたが、
・ 前のログと同タイミングで発生したログが86400になってしまう。
・ 前のログから1日以上経過しているものはうまく処理ができない。
などの問題がありました。
これらを解決する術はないでしょうか?
回答よろしくお願いします。
*追加でなんですが、もし可能であれば、idとnorimonoごとにグルーピングして、その時間の差であるtime3も求めたいと考えています。もし可能であれば以下のようなデータフレームを得られる方法も教えていただきたいです。
python
1 id time number norimono time2 20 id_1 2018-11-21 22:54:54 3 test NaT 31 id_1 2018-11-21 22:54:55 3 train NaT 42 id_2 2018-11-21 22:54:59 3 test 61.0 53 id_2 2018-11-21 22:55:59 3 train NaT 64 id_2 2018-11-21 22:56:00 3 test 55.0 75 id_2 2018-11-21 22:56:55 3 test NaT 86 id_3 2018-11-21 22:54:54 3 train NaT
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/17 16:08