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

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

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

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Raspberry Pi

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

Python

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

pandas

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

Q&A

解決済

3回答

1200閲覧

csvファイルの一括集計

F91_

総合スコア16

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Raspberry Pi

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/07/11 05:30

編集2021/07/11 06:20
import pandas as pd from openpyxl import Workbook import glob file_list=glob.glob('//192.168.1.4/pi/mydata202107*')#7月の稼働率ファイルを全て取り込み print(file_list) for file in file_list:#7月の稼働率ファイル全てに繰り返し処理で集計したい pd.read_csv(file)   x=file.iloc[:,0].count()#稼働率集計 y=file.iloc[:,1].sum()#稼働率集計 a=(str(y/x*100)+'%')#稼働率集計 rcd=[] rcd.append(a)#稼働率をリストに追加 df=pd.DataFrame(rcd)#データをpandasに変更 df.to_excel('202107.xlsx')#書き込み コード ```### 前提・実現したいこと 機械稼働率のデータを1か月毎にファイル作成し、ファイルの中には1日毎の稼働率を書き込みたいです。 ラズベリーパイの光センサーにて毎分稼働状況をcsvファイルに保存し、リアルタイムに稼働率を数字とグラフで表示しています。次のステップとしてpythonを使用し、windowsからラズベリーパイ(linux)に保存されたcsvファイル(1日毎に所得済み)を一括で取り込み、それぞれのファイルに集計を作業を加えてひと月毎のファイルに1日の稼働率書き込みを目指しています。 自分が目指している事と同じようなコードがインターネット上に情報があまりない為、コードの例を教えていただけると幸いです。 ### 発生している問題・エラーメッセージ エラーメッセージ AttributeError: 'str' object has no attribute 'iloc' ### 該当のソースコード AttributeError Traceback (most recent call last) <ipython-input-2-098ab965c9fc> in <module> 21 for file in file_list: 22 pd.read_csv(file) ---> 23 x=file.iloc[:,0].count() 24 y=file.iloc[:,1].sum() 25 a=(str(y/x*100)+'%') ### 試したこと ### 補足情報(FW/ツールのバージョンなど) for分の構造を理解していないのかもしれません。

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

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

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

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

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

meg_

2021/07/11 05:45

コードは「コードの挿入」で記入してください。
meg_

2021/07/11 05:46

> for分の構造を理解していないのかもしれません。 そもそもファイルを読み込んでいる箇所が見当たりませんが。
F91_

2021/07/11 06:22

読み込みがありませんでした。pd.read_csv(file)で繰り返し処理され、7月分のファイルを順番に繰り返し処理される理解で合っていますか?
guest

回答3

0

エラーメッセージの意味は 
変数 file は str(文字列型)であり、
文字列型には iloc というメソッドやプロパティはないよ、と言っているわけです。

下記のようにすれば良いと思いますがいかがですか?

python

1for file in file_list:#7月の稼働率ファイル全てに繰り返し処理で集計したい 2 df = pd.read_csv(file) 3   x = df.iloc[:,0].count()#稼働率集計 4 〜以下略〜

投稿2021/07/11 07:17

odataiki

総合スコア938

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

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

F91_

2021/07/11 09:31

ありがとうございます。こちらのエラーメッセージに関しては解決出来ました。
guest

0

ベストアンサー

##完成版

python

1import pandas as pd 2from openpyxl import Workbook 3import glob 4 5file_list=glob.glob('//192.168.1.4/pi/mydata202107*')#7月の稼働率ファイルを全て取り込み 6print(file_list) 7 8l=[] # 一日毎に記録するためのリストを用意 9for file in file_list:  #7月の稼働率ファイルを一日毎処理 10 df = pd.read_csv(file) # CSV読み込み、データフレーム化 11 d=(file[23:31]) # 日付の取得 12 df[3]=df[1]==df[2] # 完全停止時間 13 df=df.set_index(0) # 時間列をインデックスに退避 14 # '日付','稼働時間','無人稼働時間','完全停止時間','カウント' のリストを作成 15 l.append([d] + df.sum().to_list() + [df.sum().sum()]) 16 17df=pd.DataFrame(l) #データをpandasに変更 18 19df.columns=['日付','稼働時間','無人稼働時間','完全停止時間','カウント'] 20df['稼働率']=(df['稼働時間'] / df['カウント'] * 100).round(1) 21 22filename = d[:6] + '.xlsx' 23 24df_excel=df.drop(['完全停止時間','カウント'],axis=1) 25df_excel['稼働時間']=df_excel['稼働時間'].astype(str) + '分' 26df_excel['無人稼働時間']=df_excel['無人稼働時間'].astype(str) + '分' 27df_excel['稼働率']=df_excel['稼働率'].astype(str) + '%' 28 29df_excel.to_excel(filename) # 書き込み

concatenating-objects

リンク先に参考になる情報があります。

python

1df_list=[] 2for file in file_list:#7月の稼働率ファイル全てに繰り返し処理で集計したい 3 df_list.append(pd.read_csv(file)) 4 5df=pd.concat(df_list)

このようにいったん全てのファイルをデータフレームのリストに格納して、pandas.DataFrame.concatで一括処理した後所用の集計を実施してみてはどうでしょうか?


python

1data="""index data 20 日付20210701 31 稼働時間96分 42 無人稼働時間0分 53 稼働率100.0% 64 日付20210702 75 稼働時間299分 86 無人稼働時間0分 97 稼働率99.7% 108 日付20210703 119 稼働時間777分 1210 無人稼働時間1分 1311 稼働率99.7%""" 14import io 15import pandas as pd 16 17df = pd.read_csv(io.StringIO(data),sep=' ') 18df['index']=df['index']//4 19df.index=df.index % 4 20df.pivot(columns='index',values='data').T

いちおうやってみましたが、お勧めしません

他の方も書いていますが、まず、csvの中身を提示してください

日付、稼働時間、無人稼働時間、稼働率のヘッダーの下にデータがあるのが自然な形だと思いますが、
データフレームにするまでに色々とやりすぎてデータが変になっています。


python

1data="""21:23 1 0 221:24 1 0 321:25 1 0 421:26 1 0 521:27 1 0 621:28 1 0 721:29 1 0 821:30 1 0 921:31 1 0 1021:32 1 0 1121:33 1 0 1221:34 1 0 1321:35 1 0 1421:37 1 0 1521:38 1 0 1621:39 1 0 1721:40 1 0""" 18 19import io 20import pandas 21 22l=[] 23 24d="20210701" # 日付データの抽出に変えてください 25df = pd.read_csv(io.StringIO(data),header=None,sep=' ')  # 読み込み 26df[3]=df[1]==df[2] # 完全停止時間の列作成 27df=df.set_index(0) # 計算用に時間をindexに退避 28 29l.append([d] + df.sum().to_list() + [df.sum().sum()]) # count()の分を3つのデータの足し算で代替 30l  # 日付、稼働時間、無人稼働時間、完全停止時間、カウント 31

途中までですがここで投稿しておきます。

いったんファイルを読み込んだあと、このような変更をすると注釈に書いたリストができます。
forで日付の作成からデータフレーム作成、リスト追記をしていって
全部処理を終わった後、最初に書いたpd.DataFrame.concatpd.DataFrameで一括処理が可能です。
(各行が入ったリストをデータフレームにするので、こちらでしたね。)

稼働率は全部一緒になった後のデータフレームでも、1行1日になっていますし、すぐ出ます。

投稿2021/07/11 06:29

編集2021/07/11 10:34
toshikawa

総合スコア388

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

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

F91_

2021/07/11 09:11 編集

import pandas as pd from openpyxl import Workbook import glob file_list=glob.glob('//192.168.1.4/pi/mydata202107*') rcd=[] for file in file_list: a=pd.read_csv(file) d=(file[23:31]) x=a.iloc[:,0].count() y=a.iloc[:,1].sum() z=a.iloc[:,2].sum() w=round(y/x*100,1) rcd.append('日付'+d) rcd.append('稼働時間'+str(y)+'分') rcd.append('無人稼働時間'+str(z)+'分') rcd.append('稼働率'+str(w)+'%') df=pd.DataFrame(rcd) df.to_excel('202107.xlsx',header=False,index=False) print(df) 0 0 日付20210701 1 稼働時間96分 2 無人稼働時間0分 3 稼働率100.0% 4 日付20210702 5 稼働時間299分 6 無人稼働時間0分 7 稼働率99.7% 8 日付20210703 9 稼働時間777分 10 無人稼働時間1分 11 稼働率99.7% 上ような形で出力出来ました。ありがとうございます。理想に近づいてきました。 目指しているのは下記ですので、リンク先を参考にして粘ってみます。 日付20210701 稼働時間96分 無人稼働時間0分 日付20210702 稼働時間96分 無人稼働時間0分
F91_

2021/07/11 09:19 編集

CSVファイルの中身は以下です。ラズベリーパイの光センサーで1分毎に記録し、毎日日付毎にファイル保存しています。稼働があった場合は2例目が1となります。無人稼働の場合は2列目を0とし、3列目を1とします。完全停止中は2列目、3列目が0になります。 21:23 1 0 21:24 1 0 21:25 1 0 21:26 1 0 21:27 1 0 21:28 1 0 21:29 1 0 21:30 1 0 21:31 1 0 21:32 1 0 21:33 1 0 21:34 1 0 21:35 1 0   21:37 1 0 21:38 1 0 21:39 1 0 21:40 1 0
F91_

2021/07/11 09:39 編集

すみません。目指している形式は以下です。 202107という名前のファイル名で1か月毎に保存 稼働時間 無人稼働時間 稼働率 20210701 96 分 0分 ・・% 20210702 96 分 0分 ・・% 20210703 96 分 0分 ・・% 20210704 96 分 0分 ・・%
F91_

2021/07/11 12:51 編集

ここまで作成していただきありがとうございます。 申し訳ございません!!!私の説明が悪かったです。 21:23 1 0 21:24 1 0 21:25 1 0 21:26 1 0 21:27 1 0 21:28 1 0 21:29 1 0 21:30 1 0 21:31 1 0 21:32 1 0 21:33 1 0 21:34 1 0 21:35 1 0   21:37 1 0 21:38 1 0 21:39 1 0 21:40 1 0 上記は家庭で所得したデータなので2列目が全て1になっています。ずっと稼働状態を示しています。 停止の場合は2列目、3列目が0 21:40 0 0 稼働の場合が2列目が1、3列目が0 21:40 1 0 無人稼働の場合は2列目0、3列目1 21:40 0 1 上記としています。
F91_

2021/07/11 14:05 編集

そもそも私の説明が悪かったのですが、 df[3]=df[1]==df[2] # 完全停止時間 上記は処理内容が理解出来ていないので削除しました。 df=df.set_index(0) # 時間列をインデックスに退避 上記に関してKeyError: 'None of [0] are in the columns'となってしまいます。 自分の方で調べて考えた結果、set_indexで列番号の指定までは出来ず、column名の指定までしか出来ないのではないかと思いました。
F91_

2021/07/18 04:17

申し訳ございません。 色々とご回答をしていただきましたが、解決出来ませんでした。どうしても解決したい問題でもありますのでもう一度整理して再質問しますので、お時間などありましたらアドバイスをいただけると幸いです。
guest

0

csvファイルの形式がわからないので正しい答えは回答しようがありません。

また、質問にあるコードは全角半角を含んでいるので、動かないでしょう。

エラーは以下のようにすればなくなるでしょうが、処理論理自体が間違っているために求める答えは出ないだろうと思います。

python

1 df = pd.read_csv(file) 2 x = df.iloc[:,0].count()#稼働率集計 3 y = df.iloc[:,1].sum()#稼働率集計 4 a = (str(y/x*100)+'%')#稼働率集計

投稿2021/07/11 07:08

ppaul

総合スコア24666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問