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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

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

Python

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

pandas

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

Q&A

解決済

2回答

1561閲覧

より簡単に手間なくpythonプログラムを実行したい

F91_

総合スコア16

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

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

Python

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

pandas

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

0グッド

1クリップ

投稿2021/08/28 01:54

編集2021/08/28 02:07

実現したいこと

現場作業員の方が現場のPC(windows)を使用し、ワンクリックで集計プログラムを実行すること(ワンクリックは無理だとしても少しでも作業工数を減らしたい)
又は、自動実行が一番良いのですが、月の変わり目、休日などの条件あり、エラーなしで作り込む自信がありません。

###現在検討しているプログラム実行方法
①anacondaをインストール ※最初のみ
②jupyterを選びクリック
③集計プログラムを選び、クリック
④shift+enterを押す
⑤更新したい月を入力
⑥8月であれば202108と入力
⑦enterを押す

上記はプログラムを普段使用している人であればストレスなく行えますが、使用していない人からするとかなりストレスを感じるかと思います。ただし、慣れてしまえば大丈夫な気もしますが・・・このような作業をアイコンを選んでダブルクリックのみで済ませることが出来るのが理想です。

###使用する集計プログラム
以下のプログラムを実行することで一日毎の稼働率が把握出来るexcelファイルが作成されます。

PYTHON

1import pandas as pd 2from openpyxl import Workbook 3import glob 4 5t=input('更新したい月を入力してください') 6file_list=glob.glob('//192.168.1.4/pi/mydata'+t+'*') 7rcd={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 8 9for file in file_list: 10 11 a=pd.read_csv(file) 12 d=(file[23:31]) 13 x=a.iloc[:,0].count() 14 y=a.iloc[:,1].sum() 15 z=a.iloc[:,2].sum() 16 u=x-y-z 17 w=round(y/x*100,1) 18 rcd['日付'].append(d) 19 rcd['稼働時間(分)'].append(y) 20 rcd['無人稼働時間(分)'].append(z) 21 rcd['停止時間(分)'].append(u) 22 rcd['トータル時間(分)'].append(x) 23 rcd['稼働率(%)'].append(w) 24 25df=pd.DataFrame(rcd) 26print(df) 27 28monthly_file = f'{t}.xlsx' 29try: 30 df_m = pd.read_excel(monthly_file,dtype={'日付': str}) 31 df_output = pd.merge(df_m, df,how='outer') 32except FileNotFoundError: 33 df_output = df.copy() 34 df_output['コメント'] = None 35 36df_output.to_excel(monthly_file,index=False)

###機械からの稼働率取得方法

稼働率取得を1分毎に自動取得しています。ラズベリーパイの光センサーでシグナルタワーの点灯パターンに合わせて機械の稼働率状況をpythonプログラムにてエクセル書き込みをしています。1分毎に毎日稼働状況を書き込みしています。

python

1import RPi.GPIO as GPIO 2import datetime 3import time 4from time import sleep 5import csv 6import tkinter as tk 7import pandas as pd 8import matplotlib.pyplot as plt 9import numpy as np 10 11 12root1=tk.Tk() 13root1.title("機械稼働率") 14root1.geometry("1065x130")#ウインドウのサイズ 15 16la1= tk.LabelFrame(root1, width=120, height=50,font=("arial", 40, "bold"),relief=tk.RIDGE,bd=10,) 17la1.grid(row=0, column=0) 18 19la2= tk.LabelFrame(root1, width=500, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 20la2.grid(row=0, column=1,columnspan=2) 21 22 23la3= tk.LabelFrame(root1, width=500, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10) 24la3.grid(row=0, column=3) 25 26la4= tk.LabelFrame(root1, width=120, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 27la4.grid(row=1, column=0) 28 29la5= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 30la5.grid(row=1, column=1) 31 32la6= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 33la6.grid(row=1, column=2) 34 35la7= tk.LabelFrame(root1, width=200, height=50,font=("arial", 20, "bold"),relief=tk.RIDGE,bd=10,) 36la7.grid(row=1, column=3) 37 38 39#以下の設定で枠の大きさが設定出来る 40canvas1=tk.Canvas(la1,width=180,heigh=45,background='orange')#キャンバスエリア 41canvas2=tk.Canvas(la2,width=400,heigh=45,background='orange')#キャンバスエリア 42canvas3=tk.Canvas(la3,width=400,heigh=45,background='orange')#キャンバスエリア] 43canvas4=tk.Canvas(la4,width=180,heigh=45)#キャンバスエリア 44canvas5=tk.Canvas(la5,width=200,heigh=45,background='green')#キャンバスエリア 45canvas6=tk.Canvas(la6,width=200,heigh=45,background='red')#キャンバスエリア] 46canvas7=tk.Canvas(la7,width=400,heigh=45)#キャンバスエリア] 47 48 49canvas1.pack()#ここを書かないとcanvasがうまく入らない. 50canvas2.pack()#ここを書かないとcanvasがうまく入らない. 51canvas3.pack()#ここを書かないとcanvasがうまく入らない. 52canvas4.pack()#ここを書かないとcanvasがうまく入らない. 53canvas5.pack()#ここを書かないとcanvasがうまく入らない. 54canvas6.pack()#ここを書かないとcanvasがうまく入らない. 55canvas7.pack()#ここを書かないとcanvasがうまく入らない. 56 57 58 59dissolution=1 #計測分解能[s] 60time1=time2=time3=time4=time5=time6=time7=time8=time9=time10=time11=0 #0秒 61rate=0 62 63t1s=t1m=t1mm=t1h=0 64t2s=t2m=t2mm=t2h=0 65t3s=t3m=t3m=t3h=0 66t6s=t6m=t6mm=t6h=0 67 68 69today1=datetime.datetime.now() 70start=time.time() 71 72kikai='D-'+'32' 73 74try: 75 while True: 76 77 inputVal0=readadc(0,SPICLK,SPIMOSI,SPIMISO,SPICS)# CH0の信号を取得する プログラム運転(緑) 78 inputVal1=readadc(1,SPICLK,SPIMOSI,SPIMISO,SPICS)#アラーム(赤) 79 80 now=datetime.datetime.now() 81 now6=now-datetime.timedelta(hours=6)#24時〜30時を前日分として保存 82 nowday='{0:%Y%m%d}'.format(now6)#6時間前の日付でcsv保存するため 83 nt1=now.strftime('%H:%M')#現在時刻 84 nt='{0:%H%M}'.format(now)#時間 85 86 87 if inputVal0>2000 and inputVal1<2000:#緑点灯で赤消灯 88 #print(inputVal0) 89 time1=time1+1 90 time2=time2+1 91 time10=time10+1#csvファイル保存用 92 print('稼働時間'+str(time10)+'秒') 93 print('緑の光量'+str(inputVal0)) 94 print('赤の光量'+str(inputVal1)) 95 print(nt) 96 97 if time10 == 60:#60秒経過した場合 98 rcd=[] 99 rcd.append(now.strftime('%H:%M'))#時間追加 100 rcd.append(1) 101 rcd.append(0) 102 f=open('mydata'+nowday+'.csv','a',newline='') 103 wrtr=csv.writer(f,delimiter=',') 104 wrtr.writerow(rcd) 105 f.close() 106 time10=0#0秒に戻す 107 data=pd.read_csv('mydata'+nowday+'.csv') 108 x=data.iloc[:,0] 109 x1=x.count()#1行目のデータ個数 110 y=data.iloc[:,1] 111 y1=y.sum()#2行目の合計 112 113 z=round(y1/x1*100,1)#機械稼働率 小数点第一位まで 114 print('稼働時間'+str(y1)+'分') 115 116 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 117 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 118 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 119 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 120 canvas5.create_text(100,20,text=('稼働中'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 121 canvas6.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') 122 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 123 124 canvas1.update() 125 canvas2.update() 126 canvas3.update() 127 canvas4.update() 128 canvas5.update() 129 canvas6.update() 130 canvas7.update() 131 canvas1.delete('Y') 132 canvas2.delete('Y') 133 canvas3.delete('Y') 134 canvas4.delete('Y') 135 canvas5.delete('Y') 136 canvas6.delete('Y') 137 canvas7.delete('Y') 138 139 if inputVal1>2000 and inputVal0<2000:#赤点灯で緑消灯 140 time1=time1+1 141 time3=time3+1 142 time7=time7+1 143 time11=time11+1 144 print('準備時間'+str(time11)+'秒') 145 print('緑の光量'+str(inputVal0)) 146 print('赤の光量'+str(inputVal1)) 147 print(nt) 148 149 150 if time11 == 60: 151 rcd=[] 152 rcd.append(now.strftime('%H:%M')) 153 rcd.append(0) 154 rcd.append(0) 155 f=open('mydata'+nowday+'.csv','a',newline='') 156 wrtr=csv.writer(f,delimiter=',') 157 wrtr.writerow(rcd) 158 f.close() 159 time11=0 160 161 162 data=pd.read_csv('mydata'+nowday+'.csv') 163 x=data.iloc[:,0] 164 x1=x.count()#1行目のデータ個数 165 166 167 y=data.iloc[:,1] 168 y1=y.sum()#2行目の合計 169 170 z=round(y1/x1*100,1)#機械稼働率 小数点第一位まで 171 172 canvas1.create_text(85,20,text=('機械'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 173 canvas2.create_text(200,20,text=('稼働状況'),font=("",30,"roman"),tag='Y') 174 canvas3.create_text(200,20,text=('本日の稼働率'),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 175 canvas4.create_text(85,20,text=(kikai),font=("",30,"roman"),tag='Y') 176 canvas5.create_text(100,20,text=(''),font=("",30,"roman"),tag='Y') #タグを入れることで更新できるようにする. 177 canvas6.create_text(100,20,text=('停止中'),font=("",30,"roman"),tag='Y') 178 canvas7.create_text(200,20,text=(str(z)+'%'),font=("",40,"roman"),tag='Y') 179 180 canvas1.update() 181 canvas2.update() 182 canvas3.update() 183 canvas4.update() 184 canvas5.update() 185 canvas6.update() 186 canvas7.update() 187 canvas1.delete('Y') 188 canvas2.delete('Y') 189 canvas3.delete('Y') 190 canvas4.delete('Y') 191 canvas5.delete('Y') 192 canvas6.delete('Y') 193 canvas7.delete('Y') 194 195 elapsed_time=time.time()-start #(処理時間)=(処理が終わった時間)ー(処理を始めた時間) 196 a=dissolution - elapsed_time 197 sleep(a) 198 print('プログラム待機時間'+str(a)) 199 start=time.time() 200 201 202 203except KeyboardInterrupt: #cntl+Cで停止 204 pass 205 206 207

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

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

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

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

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

meg_

2021/08/28 02:02

> 現場作業員の方が現場のPCを使用し OSは何ですか? OSによって自動実行の方法は異なるかと思うので調べてください。 > 自動実行が一番良いのですが、月の変わり目、休日などの条件あり PCのカレンダー機能を利用して設定できないでしょうか?(PCの時刻合わせ・ロケールの設定等をちゃんとする必要あり)
guest

回答2

0

ベストアンサー

バッチファイルを使ってみてはいかがでしょうか。
ダブルクリックで実行できますし、ユーザとのインターフェースはコマンドプロンプト画面になってしまいますが、数字を入力するだけとのことですので、これで十分だと思います。
その気になれば、Pythonスクリプトを実行後、続けて当該のエクセルファイルを自動的に開く、などといった発展も可能かと思います。
(以下はバッチファイルの解説記事の一例です。)
ダブルクリックやドラッグ&ドロップでpythonを実行する (Windows) - Qiita

気になるのは、使う人は毎回、ほぼ同じ数字の入力を要求されるということでしょうか。
年の数字部分は1年の間、毎回同じだし、月の数字部分はひと月の間、毎回同じでしょう。
そこで今日の日付からあらかじめ年月を取得して表示し、それでよければそのままリターンするだけ、変更がある時だけ入力、といった工夫をするとよいかもしれませんね。
逆に、おそらく月の最初だけは前月の値を入れるかと思いますので、そこではちょっと間違いが起こりがちになりそうな気もします。

以下、プログラム例です。実際は入力値チェックなども入れないといけないかもしれません(入力桁数、入力文字種、値の妥当性など)。

python

1import datetime 2today = datetime.date.today() 3year = today.year 4month = today.month 5input_value = input("{}年{:02}月分の集計を行います (変更する場合は6桁で年月を入力) > ".format(year, month)) 6if not input_value: 7 input_value = "{}{:02}".format(year, month) 8print(input_value)

投稿2021/08/30 13:19

etherbeg

総合スコア1195

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

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

0

  • 上記はプログラムを普段使用している人であればストレスなく行えますが、使用していない人からするとかなりストレスを感じるかと思います。

当然です。

一般論として、

エンドユーザが楽に使えるようにすればするほど、ソフト開発者のスキルはより高く、開発工数はより多いことが必要になります。

データがサーバにあるなら、ネットワーク経由で実行することになりますので、DjangoやFlaskを使うアプリを組むか、ソケット通信等を使ってクライアントサーバでやるかです。どちらもそれなりにスキルが必要です。

データがローカルPCにあるなら、インストールの手間を考えると、pyinstallerのようなアプリを使って実行ファイル化を行うのでしょうが、これもそれなりにスキルが必要です。

  • 自動実行が一番良いのですが、月の変わり目、休日などの条件あり、エラーなしで作り込む自信がありません。

これを作り込めないスキルなのであれば、上記の作業はぞれ以上に難しいので自分で行うことは無理でしょう。

仕事で必要なアプリであれば、以下をお勧めします。

1 現場作業員の方の人数 × 作業削減時間/月 × 現場作業員の方の時間単価 = 削減コストを計算
2 アプリの開発内容を詳細に決めてソフト開発会社から開発見積を取る
3 上記の削減コストと開発見積をもとに、開発提案書を上司に提出して予算確保
4 発注

投稿2021/08/28 02:42

ppaul

総合スコア24666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問