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

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

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

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

Q&A

解決済

1回答

507閲覧

(Python) datatime型のデータフレームを条件分割したいです

muscat

総合スコア11

Python

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

0グッド

1クリップ

投稿2018/03/09 02:40

前提・実現したいこと

pythonでdatatime型の列があります。
基本は10分間隔なのですが、たまに30分開いている箇所があります。
そこを分割し、新しいデータフレームに代入したいと考えています。

例えばこよのうなデータがあります。

2017/1/1 0:00
2017/1/1 0:10
2017/1/1 0:20
.
.
.
2017/1/1 11:50
2017/1/1 12:00
(ここで区切りたいです)
2017/1/1 12:30
2017/1/1 12:40

このように複数箇所30分間隔が存在しているので
その個数分新しいデータフレームを生成したいです。

お手数ですが、ご教示いただきたく存じます。

コード

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataFrame.diff() で時間間隔を調べ、特定の条件(今回の場合10分以上)の場合 Series.cumsum() を使って別IDを振ります。
あとは、上記のIDによって groupby() すれば分割できるかと思います。

・・と書いてみましたが、何が何やらかと思いますので、下記にサンプルを書きましたので動作を確認してください。

Python

1import pandas as pd 2import datetime 3 4# 適当なデータを生成 5df = pd.DataFrame({'time':['2017-1-1 11:00', 6 '2017-1-1 11:10', 7 '2017-1-1 11:20', 8 '2017-1-1 11:30', 9 '2017-1-1 11:40', 10 '2017-1-1 11:50', 11 '2017-1-1 12:00', 12 '2017-1-1 12:30', 13 '2017-1-1 12:40']}) 14df['time'] = pd.to_datetime(df['time']) 15 16print(df) 17# time 18#0 2017-01-01 11:00:00 19#1 2017-01-01 11:10:00 20#2 2017-01-01 11:20:00 21#3 2017-01-01 11:30:00 22#4 2017-01-01 11:40:00 23#5 2017-01-01 11:50:00 24#6 2017-01-01 12:00:00 25#7 2017-01-01 12:30:00 26#8 2017-01-01 12:40:00 27 28 29# グループ分け用のIDを振る(間隔が10分以上あいたら別グループ) 30limit = datetime.timedelta(minutes=10) 31df['GroupID'] = (df['time'].diff() > limit).cumsum() 32 33# 上記の Group IDでグループ分けしたデータフレームを生成 34grouped_df = df.groupby('GroupID') 35 36# 各グループを表示(ループ使う場合) 37for id, sub_df in grouped_df: 38 print(sub_df) 39 40# グループIDを使って取得することも可 41print(grouped_df.get_group(0)) 42# time GroupID 43#0 2017-01-01 11:00:00 0 44#1 2017-01-01 11:10:00 0 45#2 2017-01-01 11:20:00 0 46#3 2017-01-01 11:30:00 0 47#4 2017-01-01 11:40:00 0 48#5 2017-01-01 11:50:00 0 49#6 2017-01-01 12:00:00 0 50 51print(grouped_df.get_group(1)) 52# time GroupID 53#7 2017-01-01 12:30:00 1 54#8 2017-01-01 12:40:00 1

投稿2018/03/09 04:14

magichan

総合スコア15898

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

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

muscat

2018/03/12 05:01

丁寧な回答ありがとうございました! あと、datatimeではなくてdatetimeでしたね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問