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

質問編集履歴

3

追記

2022/01/10 07:45

投稿

wasuhosu
wasuhosu

スコア17

title CHANGED
File without changes
body CHANGED
@@ -57,4 +57,69 @@
57
57
  ### 補足情報
58
58
  pythonを始めて間もなく読みずらいコードですが、どなたかご教授よろしくお願いします。
59
59
  google colaboratory python 3.7.12
60
- pandas 1.1.5
60
+ pandas 1.1.5
61
+
62
+ ### 追記
63
+
64
+ [このexcelファイルがkiso_です](https://www.dropbox.com/s/qj19d12zhjk0xgd/Book1.xlsx?dl=0)
65
+ このファイルをread_excel関数で読み取り、そのデータをgeneに送っています。
66
+ ```
67
+ import pandas as pd
68
+ import random
69
+
70
+ def read_excel():
71
+ df = pd.read_excel('Book1.xlsx')
72
+ ho = df.iloc[2:42, 32:34]
73
+ day = df.iloc[1:2, 1:32]
74
+ day = day.replace('土', 0)
75
+ day = day.replace('日', 0)
76
+ day.columns = [i + 1 for i in range(len(day.columns))]
77
+ df = df.iloc[2:42, 1:32]
78
+ df = df.fillna(0)
79
+ df = df.replace('o', 4)
80
+ df.columns = [i + 1 for i in range(len(df.columns))]
81
+ df.index = [i + 1 for i in range(len(df.index))]
82
+
83
+ holiday = ho.iloc[:,0:1].dropna().reset_index(drop=True)
84
+ holiday.columns = ['休日数']
85
+ ad = ho.iloc[:,1:2].fillna(0).reset_index(drop=True)
86
+ ad.columns = ['管理者']
87
+ kiso = df.iloc[:,0:31].reset_index(drop=True)
88
+ kiso.columns = [i + 1 for i in range(len(kiso.columns))]
89
+ return kiso,holiday,df,ad,day,len(kiso.columns)
90
+
91
+ def gene(kiso, holiday, day, days):
92
+ count = 0                 
93
+ for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理
94
+ if i % 2 == 0:
95
+ holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得
96
+
97
+ count += 1
98
+ for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から)
99
+ d = day.loc[1][l] #土日か平日を取得
100
+ g = kiso.loc[i][l]
101
+ if g != 4:
102
+ if g != 1 and g != 2 and g != 3: 
103
+ if d == 0: #希望休がなく社員の希望もなしで、休日なら
104
+ kiso.loc[i][l] = 0 #休みする
105
+ holi -= 1 #2回に1回取得するholiから1を引く
106
+ else:
107
+ kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ
108
+ else:
109
+ holi -= 1 #希望休の分の休みを引く
110
+
111
+ if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
112
+
113
+ for k in range(holi):         #残っている休みの数だけループ
114
+ while True:  #必ず休みを消化するためwhile
115
+ o = random.randint(0, 1) #午前と午後のどちらかを選ぶ
116
+ r = random.randint(1, days) #1日から31日の中で選ぶ
117
+ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
118
+ kiso.loc[i - o][r] = 0   #o,rのところを休みに
119
+ break
120
+
121
+ return kiso
122
+
123
+ kiso_,holiday,df,ad,day,days = read_excel()
124
+ kiso_ = gene(kiso_,holiday,day,days)
125
+ ```

2

誤字

2022/01/10 07:45

投稿

wasuhosu
wasuhosu

スコア17

title CHANGED
File without changes
body CHANGED
@@ -27,7 +27,7 @@
27
27
  else:
28
28
  kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ
29
29
  else:
30
- holi -= 1 #希望休の分の休を引く
30
+ holi -= 1 #希望休の分の休を引く
31
31
 
32
32
  if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
33
33
 

1

コードに説明を追加

2022/01/08 01:39

投稿

wasuhosu
wasuhosu

スコア17

title CHANGED
File without changes
body CHANGED
@@ -10,44 +10,45 @@
10
10
 
11
11
  ```
12
12
  def gene(kiso, holiday, day, days):
13
- count = 0
13
+ count = 0                 
14
- for i in range(days):
14
+ for i in range(len(kiso.index)): #今回では40回分(午前午後含む)を処理
15
15
  if i % 2 == 0:
16
- holi = holiday.loc[i / 2][0]
16
+ holi = holiday.loc[i / 2][0] #2回に1回1人分の休日数を取得
17
17
 
18
18
  count += 1
19
- for l in range(1, days + 1):
19
+ for l in range(1, days + 1): #1人分の午前、午後のどちらかを埋める(午前から)
20
- d = day.loc[1][l]
20
+ d = day.loc[1][l] #土日か平日を取得
21
- g = kiso.loc[i][l]
21
+ g = kiso.loc[i][l]
22
- if g != 4:
22
+ if g != 4:
23
- if d == 0 and g != 1 and g != 2 and g != 3:
23
+ if g != 1 and g != 2 and g != 3: 
24
+ if d == 0: #希望休がなく社員の希望もなしで、休日なら
24
- kiso.loc[i][l] = 0
25
+ kiso.loc[i][l] = 0 #休みする
25
- holi -= 1
26
+ holi -= 1 #2回に1回取得するholiから1を引く
26
- else:
27
+ else:
27
- kiso.loc[i][l] = random.randint(1, 3)
28
+ kiso.loc[i][l] = random.randint(1, 3) #希望がなく、休日でなければ
28
29
  else:
29
- holi -= 1
30
+ holi -= 1 #希望休の分の休むを引く
30
31
 
31
- if count % 2 == 0 and holi >= 1:
32
+ if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
32
33
 
33
- for k in range(holi):
34
+ for k in range(holi):         #残っている休みの数だけループ
34
- while True:
35
+ while True:  #必ず休みを消化するためwhile
35
- o = random.randint(0, 1)
36
+ o = random.randint(0, 1) #午前と午後のどちらかを選ぶ
36
- r = random.randint(1, days)
37
+ r = random.randint(1, days) #1日から31日の中で選ぶ
37
- if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:
38
+ if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
38
-
39
- kiso.loc[i - o][r] = 0
39
+ kiso.loc[i - o][r] = 0   #o,rのところを休みに
40
-
41
- break
40
+ break
42
41
 
43
42
  return kiso
44
43
 
45
44
 
46
45
  dateframe = gene(kiso_,holiday,day,days)#ここをfor文で2回実行(appendで追加)
47
46
  ```
47
+ kiso_ 実際は20人分ですが、午前と午後を分けるために40個になっています また、1,2,3はそれぞれの部署?を意味しています
48
- kiso_ ![イメージ説明](6e76c8bb7cfdd11099fb803a18021620.png)
48
+ ![イメージ説明](6e76c8bb7cfdd11099fb803a18021620.png)
49
- holiday![イメージ説明](0441813cf7a6c1acbca2b8d44faf9470.png)
49
+ holiday 休日数は半日で1回のため20人分です![イメージ説明](0441813cf7a6c1acbca2b8d44faf9470.png)
50
+
50
- day![イメージ説明](d44b4b58fbf3be25b48586b66c5650e7.png)
51
+ day 土曜と日曜を休日にするために0にしています![イメージ説明](d44b4b58fbf3be25b48586b66c5650e7.png)
51
52
  days その月の日数
52
53
  ### 試したこと
53
54
  for文を使わずに2回書いて実行してみましたが解決しませんでした。