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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

863閲覧

時系列データの時間毎の細分化

ot24

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/06/19 01:35

前提・実現したいこと

時系列データを時間毎に細分化したい。

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

入手できるデータが以下の形式で、ステータスが変化するときに行が追加されていきます。
アウトプットイメージのように時間毎のデータにするため行を追加したいのですが、時間をまたぐときのデータ処理に苦慮しております。

開始時間    終了時間 継続時間 ステータス
0 2021/06/01 08:00:00 2021/06/01 10:04:35 7475.0 2
1 2021/06/01 10:04:35 2021/06/01 10:05:00 25.0   4
2 2021/06/01 10:05:00 2021/06/01 10:10:00 300.0 2
3 2021/06/01 10:10:00 2021/06/01 10:11:01 61.0 4
4 2021/06/01 10:11:01 2021/06/01 11:07:15 3374.0 2

アウトプットイメージ

開始時間    終了時間 継続時間 ステータス
0 2021/06/01 08:00:00 2021/06/01 09:00:00 3600.0 2
1 2021/06/01 09:00:00 2021/06/01 10:00:00 3600.0  2
2 2021/06/01 10:00:00 2021/06/01 10:04:35 275.0 2
3 2021/06/01 10:04:35 2021/06/01 10:05:00 25.0 4
4 2021/06/01 10:05:00 2021/06/01 10:10:00 300.0 2
5 2021/06/01 10:10:00 2021/06/01 10:11:01 61.0 4
6 2021-06-01 10:11:01 2021/06/01 11:00:00 2939.0 2
7 2021-06-01 11:00:00 2021/06/01 11:07:15 435.0 2

該当のソースコード

python

試したこと

行の追加なりを考えましたが、初心者でいまひとつコードを作成するところまで至りませんでした。
ご教示いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういう感じです。

python

1import datetime 2df2 = df.copy() 3df2.loc[len(df2)] = [df2.iloc[len(df2)-1,1], df2.iloc[len(df2)-1,1], 0.0, 0] 4 5one_hour = datetime.timedelta(hours=1) 6start = df2['開始時間'].dt.ceil('H').min() 7end = df2['開始時間'].dt.floor('H').max() 8hours = (end - start).days*25 + (end - start).seconds//3600 + 1 9df_h = pd.DataFrame({'開始時間' : [start + one_hour * i for i in range(hours)]}) 10 11df_result = pd.merge(df2[['開始時間', 'ステータス']], df_h, how='outer').sort_values('開始時間').reset_index(drop=True).fillna(method='ffill') 12 13df_result.insert(1, '終了時間', df_result['開始時間'].shift(-1)) 14df_result.insert(2, '継続時間', (df_result['終了時間'] - df_result['開始時間']).dt.seconds) 15 16df_result.drop(len(df_result)-1, inplace=True)

入力データ

python

1>>> print(df) 2 開始時間 終了時間 継続時間 ステータス 30 2021-06-01 08:00:00 2021-06-01 10:04:35 7475 2 41 2021-06-01 10:04:35 2021-06-01 10:05:00 25 4 52 2021-06-01 10:05:00 2021-06-01 10:10:00 300 2 63 2021-06-01 10:10:00 2021-06-01 10:11:01 61 4 74 2021-06-01 10:11:01 2021-06-01 11:07:15 3374 2 85 2021-06-01 11:07:15 2021-06-01 13:46:08 9533 4 96 2021-06-01 13:46:08 2021-06-01 15:20:42 5674 3 107 2021-06-01 15:20:42 2021-06-01 16:50:00 5358 2

実行結果

python

1>>> print(df_result) 2 開始時間 終了時間 継続時間 ステータス 30 2021-06-01 08:00:00 2021-06-01 09:00:00 3600.0 2.0 41 2021-06-01 09:00:00 2021-06-01 10:00:00 3600.0 2.0 52 2021-06-01 10:00:00 2021-06-01 10:04:35 275.0 2.0 63 2021-06-01 10:04:35 2021-06-01 10:05:00 25.0 4.0 74 2021-06-01 10:05:00 2021-06-01 10:10:00 300.0 2.0 85 2021-06-01 10:10:00 2021-06-01 10:11:01 61.0 4.0 96 2021-06-01 10:11:01 2021-06-01 11:00:00 2939.0 2.0 107 2021-06-01 11:00:00 2021-06-01 11:07:15 435.0 2.0 118 2021-06-01 11:07:15 2021-06-01 12:00:00 3165.0 4.0 129 2021-06-01 12:00:00 2021-06-01 13:00:00 3600.0 4.0 1310 2021-06-01 13:00:00 2021-06-01 13:46:08 2768.0 4.0 1411 2021-06-01 13:46:08 2021-06-01 14:00:00 832.0 3.0 1512 2021-06-01 14:00:00 2021-06-01 15:00:00 3600.0 3.0 1613 2021-06-01 15:00:00 2021-06-01 15:20:42 1242.0 3.0 1714 2021-06-01 15:20:42 2021-06-01 16:00:00 2358.0 2.0 1815 2021-06-01 16:00:00 2021-06-01 16:50:00 3000.0 2.0

投稿2021/06/19 03:40

ppaul

総合スコア24668

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

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

ot24

2021/06/19 04:39

迅速なご回答ありがとうございます。苦戦していたところでしたので大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問