質問編集履歴

3

追記

2022/01/10 07:45

投稿

wasuhosu
wasuhosu

スコア17

test CHANGED
File without changes
test CHANGED
@@ -117,3 +117,133 @@
117
117
  google colaboratory python 3.7.12
118
118
 
119
119
  pandas 1.1.5
120
+
121
+
122
+
123
+ ### 追記
124
+
125
+
126
+
127
+ [このexcelファイルがkiso_です](https://www.dropbox.com/s/qj19d12zhjk0xgd/Book1.xlsx?dl=0)
128
+
129
+ このファイルをread_excel関数で読み取り、そのデータをgeneに送っています。
130
+
131
+ ```
132
+
133
+ import pandas as pd
134
+
135
+ import random
136
+
137
+
138
+
139
+ def read_excel():
140
+
141
+ df = pd.read_excel('Book1.xlsx')
142
+
143
+ ho = df.iloc[2:42, 32:34]
144
+
145
+ day = df.iloc[1:2, 1:32]
146
+
147
+ day = day.replace('土', 0)
148
+
149
+ day = day.replace('日', 0)
150
+
151
+ day.columns = [i + 1 for i in range(len(day.columns))]
152
+
153
+ df = df.iloc[2:42, 1:32]
154
+
155
+ df = df.fillna(0)
156
+
157
+ df = df.replace('o', 4)
158
+
159
+ df.columns = [i + 1 for i in range(len(df.columns))]
160
+
161
+ df.index = [i + 1 for i in range(len(df.index))]
162
+
163
+
164
+
165
+ holiday = ho.iloc[:,0:1].dropna().reset_index(drop=True)
166
+
167
+ holiday.columns = ['休日数']
168
+
169
+ ad = ho.iloc[:,1:2].fillna(0).reset_index(drop=True)
170
+
171
+ ad.columns = ['管理者']
172
+
173
+ kiso = df.iloc[:,0:31].reset_index(drop=True)
174
+
175
+ kiso.columns = [i + 1 for i in range(len(kiso.columns))]
176
+
177
+ return kiso,holiday,df,ad,day,len(kiso.columns)
178
+
179
+
180
+
181
+ def gene(kiso, holiday, day, days):
182
+
183
+ count = 0                 
184
+
185
+ for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理
186
+
187
+ if i % 2 == 0:
188
+
189
+ holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得
190
+
191
+
192
+
193
+ count += 1
194
+
195
+ for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から)
196
+
197
+ d = day.loc[1][l] #土日か平日を取得
198
+
199
+ g = kiso.loc[i][l]
200
+
201
+ if g != 4:
202
+
203
+ if g != 1 and g != 2 and g != 3: 
204
+
205
+ if d == 0: #希望休がなく社員の希望もなしで、休日なら
206
+
207
+ kiso.loc[i][l] = 0 #休みする
208
+
209
+ holi -= 1 #2回に1回取得するholiから1を引く
210
+
211
+ else:
212
+
213
+ kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ
214
+
215
+ else:
216
+
217
+ holi -= 1 #希望休の分の休みを引く
218
+
219
+
220
+
221
+ if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
222
+
223
+
224
+
225
+ for k in range(holi):         #残っている休みの数だけループ
226
+
227
+ while True:  #必ず休みを消化するためwhile
228
+
229
+ o = random.randint(0, 1) #午前と午後のどちらかを選ぶ
230
+
231
+ r = random.randint(1, days) #1日から31日の中で選ぶ
232
+
233
+ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
234
+
235
+ kiso.loc[i - o][r] = 0   #o,rのところを休みに
236
+
237
+ break
238
+
239
+
240
+
241
+ return kiso
242
+
243
+
244
+
245
+ kiso_,holiday,df,ad,day,days = read_excel()
246
+
247
+ kiso_ = gene(kiso_,holiday,day,days)
248
+
249
+ ```

2

誤字

2022/01/10 07:45

投稿

wasuhosu
wasuhosu

スコア17

test CHANGED
File without changes
test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  else:
58
58
 
59
- holi -= 1 #希望休の分の休を引く
59
+ holi -= 1 #希望休の分の休を引く
60
60
 
61
61
 
62
62
 

1

コードに説明を追加

2022/01/08 01:39

投稿

wasuhosu
wasuhosu

スコア17

test CHANGED
File without changes
test CHANGED
@@ -22,63 +22,61 @@
22
22
 
23
23
  def gene(kiso, holiday, day, days):
24
24
 
25
- count = 0
25
+ count = 0                 
26
26
 
27
- for i in range(days):
27
+ for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理
28
28
 
29
29
  if i % 2 == 0:
30
30
 
31
- holi = holiday.loc[i / 2][0]
31
+ holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得
32
32
 
33
33
 
34
34
 
35
35
  count += 1
36
36
 
37
- for l in range(1, days + 1):
37
+ for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から)
38
38
 
39
- d = day.loc[1][l]
39
+ d = day.loc[1][l] #土日か平日を取得
40
40
 
41
- g = kiso.loc[i][l]
41
+ g = kiso.loc[i][l]
42
42
 
43
- if g != 4:
43
+ if g != 4:
44
44
 
45
- if d == 0 and g != 1 and g != 2 and g != 3:
45
+ if g != 1 and g != 2 and g != 3: 
46
46
 
47
- kiso.loc[i][l] = 0
47
+ if d == 0: #希望休がなく社員の希望もなしで、休日なら
48
48
 
49
- holi -= 1
49
+ kiso.loc[i][l] = 0 #休みする
50
50
 
51
- else:
51
+ holi -= 1 #2回に1回取得するholiから1を引く
52
52
 
53
+ else:
54
+
53
- kiso.loc[i][l] = random.randint(1, 3)
55
+ kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ
54
56
 
55
57
  else:
56
58
 
57
- holi -= 1
59
+ holi -= 1 #希望休の分の休むを引く
58
60
 
59
61
 
60
62
 
61
- if count % 2 == 0 and holi >= 1:
63
+ if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
62
64
 
63
65
 
64
66
 
65
- for k in range(holi):
67
+ for k in range(holi):         #残っている休みの数だけループ
66
68
 
67
- while True:
69
+ while True:  #必ず休みを消化するためwhile
68
70
 
69
- o = random.randint(0, 1)
71
+ o = random.randint(0, 1) #午前と午後のどちらかを選ぶ
70
72
 
71
- r = random.randint(1, days)
73
+ r = random.randint(1, days) #1日から31日の中で選ぶ
72
74
 
73
- if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:
75
+ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
74
76
 
75
-
77
+ kiso.loc[i - o][r] = 0   #o,rのところを休みに
76
78
 
77
- kiso.loc[i - o][r] = 0
78
-
79
-
80
-
81
- break
79
+ break
82
80
 
83
81
 
84
82
 
@@ -92,11 +90,15 @@
92
90
 
93
91
  ```
94
92
 
95
- kiso_ ![イメージ説明](6e76c8bb7cfdd11099fb803a18021620.png)
93
+ kiso_ 実際は20人分ですが、午前と午後を分けるために40個になっています また、1,2,3はそれぞれの部署?を意味しています
96
94
 
97
- holiday![イメージ説明](0441813cf7a6c1acbca2b8d44faf9470.png)
95
+ ![イメージ説明](6e76c8bb7cfdd11099fb803a18021620.png)
98
96
 
97
+ holiday 休日数は半日で1回のため20人分です![イメージ説明](0441813cf7a6c1acbca2b8d44faf9470.png)
98
+
99
+
100
+
99
- day![イメージ説明](d44b4b58fbf3be25b48586b66c5650e7.png)
101
+ day 土曜と日曜を休日にするために0にしています![イメージ説明](d44b4b58fbf3be25b48586b66c5650e7.png)
100
102
 
101
103
  days その月の日数
102
104