teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

完成

2021/07/11 10:34

投稿

toshikawa
toshikawa

スコア388

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

3

間違いの修正

2021/07/11 10:34

投稿

toshikawa
toshikawa

スコア388

answer CHANGED
@@ -83,6 +83,7 @@
83
83
 
84
84
  いったんファイルを読み込んだあと、このような変更をすると注釈に書いたリストができます。
85
85
  forで日付の作成からデータフレーム作成、リスト追記をしていって
86
- 全部処理を終わった後、最初に書いた`pd.DataFrame.concat`で一括処理が可能です。
86
+ 全部処理を終わった後、最初に書いた~~pd.DataFrame.concat~~`pd.DataFrame`で一括処理が可能です。
87
+ (各行が入ったリストをデータフレームにするので、こちらでしたね。)
87
88
 
88
- 稼働率は全部一緒になった後のデータフレームでもすぐ出ますので大丈夫です
89
+ 稼働率は全部一緒になった後のデータフレームでも、1行1日になっていまし、すぐ出ます。

2

CSVデータの処理の仕方を追記

2021/07/11 10:07

投稿

toshikawa
toshikawa

スコア388

answer CHANGED
@@ -41,4 +41,48 @@
41
41
  他の方も書いていますが、**まず、csvの中身を提示してください**
42
42
 
43
43
  **日付、稼働時間、無人稼働時間、稼働率**のヘッダーの下にデータがあるのが自然な形だと思いますが、
44
- データフレームにするまでに色々とやりすぎてデータが変になっています。
44
+ データフレームにするまでに色々とやりすぎてデータが変になっています。
45
+
46
+ ------
47
+
48
+ ```python
49
+ data="""21:23 1 0
50
+ 21:24 1 0
51
+ 21:25 1 0
52
+ 21:26 1 0
53
+ 21:27 1 0
54
+ 21:28 1 0
55
+ 21:29 1 0
56
+ 21:30 1 0
57
+ 21:31 1 0
58
+ 21:32 1 0
59
+ 21:33 1 0
60
+ 21:34 1 0
61
+ 21:35 1 0
62
+ 21:37 1 0
63
+ 21:38 1 0
64
+ 21:39 1 0
65
+ 21:40 1 0"""
66
+
67
+ import io
68
+ import pandas
69
+
70
+ l=[]
71
+
72
+ d="20210701" # 日付データの抽出に変えてください
73
+ df = pd.read_csv(io.StringIO(data),header=None,sep=' ')  # 読み込み
74
+ df[3]=df[1]==df[2] # 完全停止時間の列作成
75
+ df=df.set_index(0) # 計算用に時間をindexに退避
76
+
77
+ l.append([d] + df.sum().to_list() + [df.sum().sum()]) # count()の分を3つのデータの足し算で代替
78
+ l  # 日付、稼働時間、無人稼働時間、完全停止時間、カウント
79
+
80
+ ```
81
+
82
+ 途中までですがここで投稿しておきます。
83
+
84
+ いったんファイルを読み込んだあと、このような変更をすると注釈に書いたリストができます。
85
+ forで日付の作成からデータフレーム作成、リスト追記をしていって
86
+ 全部処理を終わった後、最初に書いた`pd.DataFrame.concat`で一括処理が可能です。
87
+
88
+ 稼働率は全部一緒になった後のデータフレームでもすぐ出ますので大丈夫です。

1

追加の質問対応

2021/07/11 09:50

投稿

toshikawa
toshikawa

スコア388

answer CHANGED
@@ -10,4 +10,35 @@
10
10
  df=pd.concat(df_list)
11
11
  ```
12
12
 
13
- このようにいったん全てのファイルをデータフレームのリストに格納して、`pandas.DataFrame.concat`で一括処理した後所用の集計を実施してみてはどうでしょうか?
13
+ このようにいったん全てのファイルをデータフレームのリストに格納して、`pandas.DataFrame.concat`で一括処理した後所用の集計を実施してみてはどうでしょうか?
14
+
15
+ ------
16
+ ```python
17
+ data="""index data
18
+ 0 日付20210701
19
+ 1 稼働時間96分
20
+ 2 無人稼働時間0分
21
+ 3 稼働率100.0%
22
+ 4 日付20210702
23
+ 5 稼働時間299分
24
+ 6 無人稼働時間0分
25
+ 7 稼働率99.7%
26
+ 8 日付20210703
27
+ 9 稼働時間777分
28
+ 10 無人稼働時間1分
29
+ 11 稼働率99.7%"""
30
+ import io
31
+ import pandas as pd
32
+
33
+ df = pd.read_csv(io.StringIO(data),sep=' ')
34
+ df['index']=df['index']//4
35
+ df.index=df.index % 4
36
+ df.pivot(columns='index',values='data').T
37
+ ```
38
+
39
+ いちおうやってみましたが、**お勧めしません**
40
+
41
+ 他の方も書いていますが、**まず、csvの中身を提示してください**
42
+
43
+ **日付、稼働時間、無人稼働時間、稼働率**のヘッダーの下にデータがあるのが自然な形だと思いますが、
44
+ データフレームにするまでに色々とやりすぎてデータが変になっています。