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

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

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

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

Q&A

1回答

1451閲覧

[Python]時系列データで、指定条件の合計時間を取得したい

nishi11

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2021/05/16 05:20

編集2021/05/17 03:57

Python初心者です。
時系列データの集計方法が分からず困っています。

例 1分毎に測定した1日の気温変化の時系列データがあります。
気温25度以上、気温10度以上20度未満 など条件を指定し、その合計時間を取得する方法を教えて頂きたい。

説明し易いように気温を例にあげましたが、行いたい内容は下記になります。

バッテリーの出力電圧と出力電流を0.2秒毎にサンプリングしたデータ(csv)があります。
データの一部です。

NO. time  V A
13 00:02.4 23.48 5.695
14 00:02.6 18.8 14.98
15 00:02.8 18.77 14.675
16 00:03.0 23.72 6.645
17 00:03.2 22.64 7.81
18 00:03.4 26.87 0.355
19 00:03.6 27.1 0.02
20 00:03.8 27.05 0.14
21 00:04.0 25.55 1.99
22 00:04.2 19.31 13.305
23 00:04.4 18.52 14.705
24 00:04.6 18.49 14.69
25 00:04.8 18.4 14.705
26 00:05.0 18.39 14.67
27 00:05.2 18.33 14.7

このデータから次のことを求め、分析したいと考えています。
1 時間(time)と出力電流(A)のグラフ化
2 バッテリーの消費容量
3 電流10A以上の合計時間
4 電流5A以上10A未満の合計時間

1グラフ化と2消費容量は求めることができました。
イメージ説明   
X軸:時間 Y軸:電流 第二軸Y:消費容量 赤線:出力電流 青線:累積消費容量

時系列データで、月、日、時間ごとの集計方法については、いろいろなサイトに載っているのですが、3,4電流条件を指定した場合の合計時間の取得方法がわかりません。ご教授いただければ幸いです。

作ったソースコード

python

1import matplotlib.pyplot as plt 2import matplotlib.dates as dt 3import pandas as pd 4import datetime 5#ノートブック内にグラフを表示するために必要 6%matplotlib inline 7 8df=pd.read_csv("CSV.csv",nrows=4790,encoding='shift_jis',header=0,index_col=0) 9 10#datetime型に変換 11df['time']=pd.to_datetime(df['time'], format='%M:%S.%f') 12#datetime型から分,秒、マイクロ秒の抽出 13a=df['time'].dt.minute 14b=df['time'].dt.second 15c=df['time'].dt.microsecond 16 17#積分用に経過時間(秒)を取得 18d=a*60+b+c/1000000 19df['T']=d 20#累積の台形則による数値積分 21from scipy import integrate 22x=df['T'] 23y=df['A'] 24df['integral']=integrate.cumtrapz(y,x,initial=0) 25#消費容量の単位をAsからmAhに変換 26cap = df['integral']*1000/3600 27 28#グラフ化 29import numpy as np 30#日本語を表示するためにjapanize_matplotlibをインポート 31import japanize_matplotlib 32#時系列データの軸目盛の設定のため 33import matplotlib.dates as mdates 34fig, ax1 = plt.subplots(figsize=(30, 10)) 35X=df['time'] 36Y=df['A'] 37ax1.plot(X,Y,color='red') 38ax1.xaxis.set_major_locator(mdates.MinuteLocator(byminute=range(0, 3, 1))) 39ax1.xaxis.set_major_formatter(mdates.DateFormatter('%M-%S')) 40#X軸を共有してY軸を第2軸に設定 41ax2=ax1.twinx() 42ax2.plot(X,cap,color='blue') 43ax2.set_yticks( np.arange(0,200,10) ) 44#軸ラベルのの回転 45ax1.tick_params(axis='x', rotation=90)

試したこと

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

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

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

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

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

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

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

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

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

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

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

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

meg_

2021/05/16 07:34

途中でも良いので作成しているコードを載せましょう。また、調べたこと・試したことは何一つ有りませんか?
guest

回答1

0

丸投げの質問ですが一回目は大目に見ましょう。

以下にサンプルプログラムを書いておきます。これを理解するためにpandasの勉強をしてください。

csvファイルとかに入っているなら、pandasで読み込んで分類します。

乱数で作ったデータですが、以下のようになります。

python

1import pandas as pd 2import io 3 4indata = '''日時,気温 52021-12-16 12:00,25 62021-12-16 12:01,20 72021-12-16 12:02,25 82021-12-16 12:03,27 92021-12-16 12:04,16 102021-12-16 12:05,16 112021-12-16 12:06,24 122021-12-16 12:07,20 132021-12-16 12:08,23 142021-12-16 12:09,25 152021-12-16 12:10,23 162021-12-16 12:11,25 172021-12-16 12:12,21 182021-12-16 12:13,15 192021-12-16 12:14,16 202021-12-16 12:15,26 212021-12-16 12:16,19 222021-12-16 12:17,25 232021-12-16 12:18,26 242021-12-16 12:19,15''' 25 26#with open('test.csv') as f: 27with io.StringIO(indata) as f: 28 df = pd.read_csv(f, engine='python', parse_dates=[0]) 29 30def classify(temp): 31 if temp < 10: 32 return '気温10度未満' 33 elif temp < 20: 34 return '気温10度以上20度未満' 35 elif temp < 25: 36 return '気温20度以上25度未満' 37 else: 38 return '気温25度以上' 39 40df['範囲'] = df['気温'].apply(classify).drop('日時') 41result = df.groupby('範囲').count().drop('日時', axis=1) 42result.columns = ['合計分数'] 43print(result)

実行結果は以下です。

python

1>>> print(result) 2 合計分数 3範囲 4気温10度以上20度未満 6 5気温20度以上25度未満 6 6気温25度以上 8 7

投稿2021/05/16 10:22

ppaul

総合スコア24670

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

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

nishi11

2021/05/17 04:17

質問の仕方を分かっておらず、すいませんでした。 回答いただきありがとうございます。 サンプルプログラムを試したところ、合計時間を取得することができました。 日時の間隔が1分に限らず、合計時間を取得できればと思っております。 質問の内容を追加しました。ご教授頂ければ幸いです。
ppaul

2021/05/18 22:37

回答後に質問内容を変更する質問者にはお答えしないことにしております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問