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

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

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

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

pandas

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

Q&A

解決済

3回答

2793閲覧

エクセルシート毎に各機械の機械稼働率を書き込みしたい

F91_

総合スコア16

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/09/07 04:01

実現したいこと

エクセルシート毎に各機械の機械稼働率を書き込みしたい。
以下画像は1台分の一か月稼働率ですが、シートを追加して他の機械の稼働率も入れたいと思います。
イメージ説明

###前提
工場に加工機が7台あり、7台全てのシグナルタワーにラズベリーパイを取付し、光センサーにて稼働率を読み取っています。
当初はエクセルファイル1つに対して、1台分の一か月の稼働率を記録で進めていましたが、
1つのエクセルファイルで7台分の稼働率をシート毎に分けてほしいと要望があり、プログラム作成中です。

試したこと

追記モードにてto_excelの引数にmode='a'を入れましたが、動作していません。
追記モードなしで2台目以降をシート名を変更して書き込みしても、1台目のデータがなくなり、2台目のデータのみとなってしまいます。

TypeError: to_excel() got an unexpected keyword argument 'mode'

該当のソースコード

python

1import pandas as pd 2from openpyxl import Workbook 3import glob 4 5t=input('更新したい月を入力してください') 6file_list1=glob.glob('//192.168.3.141/pi/mydata'+t+'*') 7file_list2=glob.glob('//192.168.3.140/pi/mydata'+t+'*') 8file_list3=glob.glob('//192.168.3.139/pi/mydata'+t+'*') 9file_list4=glob.glob('//192.168.3.135/pi/mydata'+t+'*') 10file_list5=glob.glob('//192.168.3.132/pi/mydata'+t+'*') 11file_list6=glob.glob('//192.168.3.131/pi/mydata'+t+'*') 12file_list7=glob.glob('//192.168.3.134/pi/mydata'+t+'*') 13 14rcd1={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 15 16for file1 in file_list1: 17 18 a1=pd.read_csv(file1) 19 d1=(file1[25:33]) 20 x1=a1.iloc[:,0].count() 21 y1=a1.iloc[:,1].sum() 22 z1=a1.iloc[:,2].sum() 23 u1=x1-y1-z1 24 w1=round(y1/x1*100,1) 25 rcd1['日付'].append(d1) 26 rcd1['稼働時間(分)'].append(y1) 27 rcd1['無人稼働時間(分)'].append(z1) 28 rcd1['停止時間(分)'].append(u1) 29 rcd1['トータル時間(分)'].append(x1) 30 rcd1['稼働率(%)'].append(w1) 31 32df1=pd.DataFrame(rcd1) 33print(df1) 34g1='稼働率' 35 36monthly_file1 =g1+ f'{t}.xlsx' 37try: 38 df_m1 = pd.read_excel(monthly_file1,dtype={'日付': str}) 39 df_output1 = pd.merge(df_m1, df1,how='outer') 40except FileNotFoundError: 41 df_output1 = df1.copy() 42 df_output1['コメント'] = None 43 44df_output1.to_excel('//192.168.3.225/Share\工場/推進室\機械導入PJ/IOT/'+monthly_file1,sheet_name='D31',index=False) 45 46 47rcd2={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 48 49for file2 in file_list2: 50 51 a2=pd.read_csv(file2) 52 d2=(file2[25:33]) 53 x2=a2.iloc[:,0].count() 54 y2=a2.iloc[:,1].sum() 55 z2=a2.iloc[:,2].sum() 56 u2=x2-y2-z2 57 w2=round(y2/x2*100,1) 58 rcd2['日付'].append(d2) 59 rcd2['稼働時間(分)'].append(y2) 60 rcd2['無人稼働時間(分)'].append(z2) 61 rcd2['停止時間(分)'].append(u2) 62 rcd2['トータル時間(分)'].append(x2) 63 rcd2['稼働率(%)'].append(w2) 64 65df2=pd.DataFrame(rcd2) 66print(df2) 67g2='稼働率' 68 69monthly_file1 =g2+ f'{t}.xlsx' 70try: 71 df_m2 = pd.read_excel(monthly_file2,dtype={'日付': str}) 72 df_output2 = pd.merge(df_m2, df2,how='outer') 73except FileNotFoundError: 74 df_output2 = df2.copy() 75 df_output2['コメント'] = None 76 77df_output2.to_excel('//192.168.3.225/Share\工場/推進室\機械導入PJ/IOT/'+monthly_file1,sheet_name='D32',mode='a',index=False)

まずは2台分で上手くいくか調整中です。

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

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

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

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

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

guest

回答3

0

ベストアンサー

以下はto_excelメソッドについての公式のAPIレファレンスです。
pandas.DataFrame.to_excel — pandas 1.3.2 documentation

Examples(コード例)のところを見てもらうと、

ひとつのワークブック内に複数のシートを一度に書き込む場合は、

python

1df2 = df1.copy() 2with pd.ExcelWriter('output.xlsx') as writer: 3 df1.to_excel(writer, sheet_name='Sheet_name_1') 4 df2.to_excel(writer, sheet_name='Sheet_name_2')

また既存のエクセルファイルにシートを追加する場合は、

python

1with pd.ExcelWriter('output.xlsx', 2 mode='a') as writer: 3 df.to_excel(writer, sheet_name='Sheet_name_3')

投稿2021/09/07 04:21

etherbeg

総合スコア1195

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

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

F91_

2021/09/07 07:00

ありがとうございます。まずは試してみます。
F91_

2021/09/07 23:11

上手くいきましたので、自己解決の所に入れておきます。ただ、毎度のことですが関数で可能な限りまとめたいと思います。
F91_

2021/09/08 22:56

現場担当者の方が何かトラブルが発生した場合にエクセルのコメント欄に手入力で理由を記載し、 更新されても消去されないプログラムにしましたが、上手くいっておりません。 別の問題かもしれませんので、解決しない場合は再投稿致します。
F91_

2021/09/12 05:10

コメント欄に手入力し、更新されても消去されないプログラムも上手くいきました。 再度プログラムは修正して投稿しておきました。自宅のPCで試しただけなので、明日会社で試して上手くいけばとりあえずは一段落しそうです。
etherbeg

2021/09/14 08:52

本番環境で稼働しながら要望に応えて改修とはハードですね。家で作業されてる分は給料出ませんよね…
F91_

2021/09/22 11:22

家での作業は給料は出ないですね・・・私の会社での評価が低いが為に大きな改善でアピールをしている所です。プログラミングもここ一年で独学でなんとかしました。 転職した方が良いかもしれませんが 笑 そして何度もすみません。 新たな問題が発生していまして、一日に二度プログラムを実行すると、当日分のデータがダブルという点です。mergeメソッドでhow='outer'で結合しているので、計測中である当日分が プログラム実行前とプログラム実行後のデータが違うため二つとなります。 解決策としては当日分を計算しないプログラムにするか、コメントの取り方を変更するか検討しています。 他にもプログラム以外で会社の課題がありましてそちらを進めないと間に合わないので、 どうか知恵を貸していただけないでしょうか? 質問として投げようかと思っていますが、やってほしいことを投げているだけだとクレームがきますので悩んでいます。
etherbeg

2021/09/22 13:17 編集

手元のサンプルデータで再現できました。 当日分を計算するんだったら、1日に2度実行したときは最新の方のデータだけ有効になって欲しいってことですよね。 もし当日分を計算する場合、当日分にコメントが書き込まれることはあり得ますか? あと解決策として、当日分を計算しないプログラムにするっていうのは分かりますが、コメントの取り方を変更するっていうのはどういう意味ですか?
F91_

2021/09/22 14:16

ご回答ありがとうございます。 最新の方のデータだけ有効になって欲しいってことで合っています。 当日分にコメントが書き込まれる事が多いと思います。 17時に定時退社の場合、その日に何かトラブルがあった場合はコメントを残そうというルールで考えています。なのでエクセルにコメントを書き込んで保存して帰宅というパターンになるかと思います。こうなってくると当日分を計算しないはNGかもしれませんね・・・ コメントの取り方の変更とは、すでに保存済みのエクセルのコメント行のみ引っ張り、 計算されたデータを結合する方法です。今はhow='outer'で結合していますが、結合方法の変更です。
etherbeg

2021/09/22 14:44

なるほど、なるほど。 となると単純に新しい方のデータを残す方法では対応できないですね。 保存されたエクセルからはコメント行のみ取得するようにして、計算されたデータと結合する、というのは確かにひとつの手ですね。 私もちょっと考えてみますね。
etherbeg

2021/09/22 16:46

「pythonプログラムにてエクセル更新をしても手入力したコメントはそのままにするプログラムを作成したい」 https://teratail.com/questions/350487 に新しく回答を追加する形で、コード例を投稿しました。
F91_

2021/09/22 23:01

ありがとうございます。
guest

0

python

1import pandas as pd 2from openpyxl import Workbook 3import glob 4import datetime 5 6today = datetime.date.today() 7year = today.year 8month = today.month 9 10input_value= input("{}年{:02}月分の集計を行います。Enterを押してください。 (別の月を集計する場合は6桁で年月を入力し、Enterを押してください) > ".format(year, month)) 11if not input_value: 12 input_value = "{}{:02}".format(year, month) 13 14file_list1=glob.glob('//192.168.3.141/pi/mydata'+input_value+'*') 15file_list2=glob.glob('//192.168.3.140/pi/mydata'+input_value+'*') 16file_list3=glob.glob('//192.168.3.139/pi/mydata'+input_value+'*') 17file_list4=glob.glob('//192.168.3.135/pi/mydata'+input_value+'*') 18file_list5=glob.glob('//192.168.3.132/pi/mydata'+input_value+'*') 19file_list6=glob.glob('//192.168.3.131/pi/mydata'+input_value+'*') 20file_list7=glob.glob('//192.168.3.134/pi/mydata'+input_value+'*') 21 22g='三課伸線稼働率(全機械)' 23monthly_file =g+ f'{input_value}.xlsx' 24 25rcd1={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 26 27for file1 in file_list1: 28 a1=pd.read_csv(file1) 29 d1=(file1[25:33]) 30 x1=a1.iloc[:,0].count() 31 y1=a1.iloc[:,1].sum() 32 z1=a1.iloc[:,2].sum() 33 u1=x1-y1-z1 34 w1=round(y1/x1*100,1) 35 rcd1['日付'].append(d1) 36 rcd1['稼働時間(分)'].append(y1) 37 rcd1['無人稼働時間(分)'].append(z1) 38 rcd1['停止時間(分)'].append(u1) 39 rcd1['トータル時間(分)'].append(x1) 40 rcd1['稼働率(%)'].append(w1) 41 42df1=pd.DataFrame(rcd1) 43 44rcd2={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 45 46for file2 in file_list2: 47 a2=pd.read_csv(file2) 48 d2=(file2[25:33]) 49 x2=a2.iloc[:,0].count() 50 y2=a2.iloc[:,1].sum() 51 z2=a2.iloc[:,2].sum() 52 u2=x2-y2-z2 53 w2=round(y2/x2*100,1) 54 rcd2['日付'].append(d2) 55 rcd2['稼働時間(分)'].append(y2) 56 rcd2['無人稼働時間(分)'].append(z2) 57 rcd2['停止時間(分)'].append(u2) 58 rcd2['トータル時間(分)'].append(x2) 59 rcd2['稼働率(%)'].append(w2) 60 61df2=pd.DataFrame(rcd2) 62 63rcd3={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 64 65for file3 in file_list3: 66 a3=pd.read_csv(file3) 67 d3=(file2[25:33]) 68 x3=a3.iloc[:,0].count() 69 y3=a3.iloc[:,1].sum() 70 z3=a3.iloc[:,2].sum() 71 u3=x3-y3-z3 72 w3=round(y2/x2*100,1) 73 rcd3['日付'].append(d3) 74 rcd3['稼働時間(分)'].append(y3) 75 rcd3['無人稼働時間(分)'].append(z3) 76 rcd3['停止時間(分)'].append(u3) 77 rcd3['トータル時間(分)'].append(x3) 78 rcd3['稼働率(%)'].append(w3) 79 80df3=pd.DataFrame(rcd3) 81 82rcd4={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 83 84for file4 in file_list4: 85 a4=pd.read_csv(file4) 86 d4=(file4[25:33]) 87 x4=a4.iloc[:,0].count() 88 y4=a4.iloc[:,1].sum() 89 z4=a4.iloc[:,2].sum() 90 u4=x4-y4-z4 91 w4=round(y2/x2*100,1) 92 rcd4['日付'].append(d4) 93 rcd4['稼働時間(分)'].append(y4) 94 rcd4['無人稼働時間(分)'].append(z4) 95 rcd4['停止時間(分)'].append(u4) 96 rcd4['トータル時間(分)'].append(x4) 97 rcd4['稼働率(%)'].append(w4) 98 99df4=pd.DataFrame(rcd4) 100 101rcd5={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 102 103for file5 in file_list5: 104 a5=pd.read_csv(file5) 105 d5=(file5[25:33]) 106 x5=a5.iloc[:,0].count() 107 y5=a5.iloc[:,1].sum() 108 z5=a5.iloc[:,2].sum() 109 u5=x5-y5-z5 110 w5=round(y2/x2*100,1) 111 rcd5['日付'].append(d5) 112 rcd5['稼働時間(分)'].append(y5) 113 rcd5['無人稼働時間(分)'].append(z5) 114 rcd5['停止時間(分)'].append(u5) 115 rcd5['トータル時間(分)'].append(x5) 116 rcd5['稼働率(%)'].append(w5) 117df5=pd.DataFrame(rcd5) 118 119rcd6={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 120 121for file6 in file_list6: 122 a6=pd.read_csv(file6) 123 d6=(file6[25:33]) 124 x6=a6.iloc[:,0].count() 125 y6=a6.iloc[:,1].sum() 126 z6=a6.iloc[:,2].sum() 127 u6=x6-y6-z6 128 w6=round(y2/x2*100,1) 129 rcd6['日付'].append(d6) 130 rcd6['稼働時間(分)'].append(y6) 131 rcd6['無人稼働時間(分)'].append(z6) 132 rcd6['停止時間(分)'].append(u6) 133 rcd6['トータル時間(分)'].append(x6) 134 rcd6['稼働率(%)'].append(w6) 135 136df6=pd.DataFrame(rcd6) 137 138rcd7={'日付' : [], '稼働時間(分)': [], '無人稼働時間(分)': [], '停止時間(分)': [],'トータル時間(分)': [],'稼働率(%)': []} 139 140for file7 in file_list7: 141 a7=pd.read_csv(file7) 142 d7=(file7[25:33]) 143 x7=a7.iloc[:,0].count() 144 y7=a7.iloc[:,1].sum() 145 z7=a7.iloc[:,2].sum() 146 u7=x7-y7-z7 147 w7=round(y2/x2*100,1) 148 rcd7['日付'].append(d7) 149 rcd7['稼働時間(分)'].append(y7) 150 rcd7['無人稼働時間(分)'].append(z7) 151 rcd7['停止時間(分)'].append(u7) 152 rcd7['トータル時間(分)'].append(x7) 153 rcd7['稼働率(%)'].append(w7) 154 155df7=pd.DataFrame(rcd7) 156 157try: 158 df_m1 = pd.read_excel(monthly_file,sheet_name=0,dtype={'日付': str}) 159 df_output1 = pd.merge(df_m1, df1,how='outer') 160except FileNotFoundError: 161 df_output1 = df1.copy() 162 df_output1['コメント'] = None 163 164try: 165 df_m2 = pd.read_excel(monthly_file,sheet_name=1,dtype={'日付': str}) 166 df_output2 = pd.merge(df_m2, df2,how='outer') 167except FileNotFoundError: 168 df_output2 = df2.copy() 169 df_output2['コメント'] = None 170 171try: 172 df_m3 = pd.read_excel(monthly_file,sheet_name=2,dtype={'日付': str}) 173 df_output3 = pd.merge(df_m3, df3,how='outer') 174except FileNotFoundError: 175 df_output3 = df3.copy() 176 df_output3['コメント'] = None 177 178try: 179 df_m4 = pd.read_excel(monthly_file,sheet_name=3,dtype={'日付': str}) 180 df_output4 = pd.merge(df_m4, df4,how='outer') 181except FileNotFoundError: 182 df_output4 = df4.copy() 183 df_output4['コメント'] = None 184 185try: 186 df_m5 = pd.read_excel(monthly_file,sheet_name=4,dtype={'日付': str}) 187 df_output5 = pd.merge(df_m5, df5,how='outer') 188except FileNotFoundError: 189 df_output5 = df5.copy() 190 df_output5['コメント'] = None 191 192try: 193 df_m6 = pd.read_excel(monthly_file,sheet_name=5,dtype={'日付': str}) 194 df_output6 = pd.merge(df_m6, df6,how='outer') 195except FileNotFoundError: 196 df_output6 = df6.copy() 197 df_output6['コメント'] = None 198 199try: 200 df_m7 = pd.read_excel(monthly_file,sheet_name=6,dtype={'日付': str}) 201 df_output7 = pd.merge(df_m7, df7,how='outer') 202except FileNotFoundError: 203 df_output7 = df7.copy() 204 df_output7['コメント'] = None 205 206 207with pd.ExcelWriter('//192.168.3.225/Share\石岡工場/INV推進室\機械導入PJ/IOT/'+monthly_file) as writer: 208 df_output1.to_excel(writer,sheet_name='D31',index=False) 209 df_output2.to_excel(writer,sheet_name='D32',index=False) 210 df_output3.to_excel(writer,sheet_name='D33',index=False) 211 df_output4.to_excel(writer,sheet_name='D34',index=False) 212 df_output5.to_excel(writer,sheet_name='D35',index=False) 213 df_output6.to_excel(writer,sheet_name='D36',index=False) 214 df_output7.to_excel(writer,sheet_name='D37',index=False)

投稿2021/09/09 03:44

編集2021/09/12 05:06
F91_

総合スコア16

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

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

0

重複してしまいましたが、削除が出来ないので残ってしまっています。

投稿2021/09/08 22:52

編集2021/09/09 03:48
F91_

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問