質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

580閲覧

pandas時系列ログデータの時間の差を求めたい。

pdaocmhii

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/09/06 15:06

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python

1df["time2"] = df[["id","time"]].groupby("id").diff(-1) 2df["time2"] = [i.total_seconds() for i in df["time2"]] 3print(df) 4 5""" 6 id time number norimono time2 70 id_1 2018-11-21 22:54:54 3 test -1.0 81 id_1 2018-11-21 22:54:55 3 train NaN 92 id_2 2018-11-21 22:54:59 3 test -60.0 103 id_2 2018-11-21 22:55:59 3 train -1.0 114 id_2 2018-11-21 22:56:00 3 test -55.0 125 id_2 2018-11-21 22:56:55 3 test NaN 136 id_3 2018-11-21 22:57:54 3 train NaN 14"""

投稿2019/09/07 01:31

meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pdaocmhii

2019/09/17 16:08

返事が遅れて申し訳ありません。 うまくいきました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問