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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

pandas

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

Q&A

解決済

2回答

4823閲覧

【Python、pandas、Dataframe】1分単位のデータを、1時間単位・設定条件下で平均化したデータへと変換したい

heisan

総合スコア2

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/11/19 08:19

前提・実現したいこと

・言語:Python3系
・開発環境:Anaconda
・IDE:Spyder
でデータ分析を行っています。

下記の【現状のデータ】のような1分単位の温度データとシステムの運転データ(0:停止、1:運転)がひと月分記録されたDataFrameを扱っています。

このデータを、運転時(Sysstatus=1)のデータのみを抽出しそれらのデータの平均値を計算し、下記の【作りたいデータ】のような1時間単位のデータを作成したいです。

######【現状のデータ(DataFrame)】
DATE TIME Tempreture1 Tempreture2 SysStatus
2020/5/1 0:00:00 18.75 17.91 0
2020/5/1 0:01:00 18.76 17.90 0
2020/5/1 0:02:00 18.76 17.91 0
2020/5/1 0:03:00 18.76 17.90 0
2020/5/1 0:04:00 18.77 17.91 1
2020/5/1 0:05:00 18.75 17.90 1


######【作りたいデータ(DataFrame)】
DATE TIME Tempreture1 Tempreture2 SysStatus
2020/5/1 0:00:00 18.75 17.91 0
2020/5/1 1:00:00 18.76 17.90 1
2020/5/1 2:00:00 18.76 17.91 1
2020/5/1 3:00:00 18.76 17.90 1
2020/5/1 4:00:00 18.77 17.91 0
2020/5/1 5:00:00 18.75 17.90 0


試したこと・課題

現状、「resample().mean()」を用いて平均値の計算を行おうと考えていましたが、下記のコードでは運転/停止の区別ができておらず、全てのデータを平均化の計算に用いている状態です。

python3

1DF=df.resample(rule='H').mean()

この計算を1時間のうち30分のみで運転が行われているならば、その30分間のデータを用いて平均値を計算し代表値としたいのですが、よい方法が思いつかず詰まっています。

何らかの関数を定義し、meanメソッドではなくapplyメソッドを用いることで問題を解決できるかとも考えましたが、初学者のためうまくいきませんでした。

拙い質問内容・文章となっていますが、ご回答よろしくお願いいたします。


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

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

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

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

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

guest

回答2

0

元データをSysStatusの値で絞ったあとに.resampleすればよいです。
なお、元データがDATETIMEで別列に分かれている場合は、それらを結合して日時型の列を作成して、その列に対して.resampleしてください。

Python

1import pandas as pd 2import numpy as np 3 4# テストデータ 5dt = pd.date_range('2020-05-01 00:00:00', '2020-05-01 03:00:00', freq='1min') 6df = pd.DataFrame({ 7 'dt':dt, 8 'Temp1':np.random.uniform(10,20,size=(len(dt))), 9 'Temp2':np.random.uniform(20,30,size=(len(dt))), 10 'Sts':np.random.randint(0,2,size=(len(dt)))}) 11 12dfm = df[df['Sts']==1].resample('H', on='dt').mean() 13print(dfm) 14# Temp1 Temp2 Sts 15#dt 16#2020-05-01 00:00:00 14.957330 24.223443 1.0 17#2020-05-01 01:00:00 15.546989 25.502660 1.0 18#2020-05-01 02:00:00 15.089632 24.818902 1.0 19 20# 必要におうじて整形 21dfm = dfm.reset_index() 22dfm['DATE'] = dfm['dt'].dt.date 23dfm['TIME'] = dfm['dt'].dt.time 24dfm = dfm[['DATE','TIME','Temp1','Temp2']] 25print(dfm) 26# DATE TIME Temp1 Temp2 27#0 2020-05-01 00:00:00 14.957330 24.223443 28#1 2020-05-01 01:00:00 15.546989 25.502660 29#2 2020-05-01 02:00:00 15.089632 24.818902

投稿2021/11/19 09:09

can110

総合スコア38341

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

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

heisan

2021/11/19 14:13

おかげさまで解決いたしました!ありがとうございました!
guest

0

ベストアンサー

python

1import pandas as pd 2import numpy as np 3from numpy.random import default_rng 4 5pd.options.display.float_format="{:.2f}".format 6 7# dataframe for testing 8rg = default_rng() 9N = 31 * 24 * 60 10df = pd.DataFrame({ 11 'Datetime': pd.date_range(start='2020/5/1', periods=N, freq='min'), 12 'Tempreture1': rg.uniform(10.0, 25.0, N), 13 'Tempreture2': rg.uniform(10.0, 25.0, N), 14 'SysStatus': rg.integers(0, 2, N), 15}) 16 17dfx = ( 18 df[df['SysStatus']==1] 19 .set_index('Datetime') 20 .resample(rule='H').mean() 21 .reset_index()) 22 23print(dfx) 24 25# 26 Datetime Tempreture1 Tempreture2 SysStatus 270 2020-05-01 00:00:00 17.80 17.54 1.00 281 2020-05-01 01:00:00 17.31 17.57 1.00 292 2020-05-01 02:00:00 18.27 17.35 1.00 303 2020-05-01 03:00:00 17.71 16.08 1.00 314 2020-05-01 04:00:00 18.55 16.99 1.00 32.. ... ... ... ... 33739 2020-05-31 19:00:00 17.56 16.79 1.00 34740 2020-05-31 20:00:00 18.05 17.98 1.00 35741 2020-05-31 21:00:00 18.91 16.84 1.00 36742 2020-05-31 22:00:00 17.24 19.03 1.00 37743 2020-05-31 23:00:00 17.06 17.23 1.00 38 39[744 rows x 4 columns]

SysStatus == 1 でフィルタリングしたので、SysStatus の値は常に 1 になっています。

投稿2021/11/19 08:59

melian

総合スコア20655

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

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

heisan

2021/11/19 14:12

ありがとうございます!単純なフィルタリングで解消できたんですね! 一番早く回答いただいたのでベストアンサーにさせていただきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問