ヘタレシステム管理者の管理人です。
pythonでの勉強9日目です。
今のところの目標は・・・
pythonでシフト表を自動で組んでみることですが・・・
その手前で躓きまくりです。
とりあえず・・・
今頑張っているのは・・・・
エクセルから欲しいデータを取得する方法です。
エクセルから欲しいデータを自由に取得する
抽出したいデータは・・・
よくあるシフト表から
- 勤務日
- 従業員名
- 従業員別の休暇取得数
- 各日付の出勤日数
です。
エクセルを読み込んでこれらのデータを配列で取得することが結構ムズイ・・・
ここまででかなりの日数を要しました。
コード
コードは次のとおりです。
#ライブラリをインポート
import pandas
import openpyxl
#ファイルを指定
df = pandas.read_excel('python_shift2.xlsx')
#勤務表を取得
df = df.iloc[6:, 0:]
df = df.reset_index(drop=True)
df.columns = [i for i in range(len(df.columns)) ]
#空白値を0
df=df.fillna(0)
#希望休を2に置換
df=df.replace('◎',1)
#表を表示させて確認
print(df)
#変数設定
#勤務日を取得して確認
workdays = list(range(1,32))
print(workdays)
#従業員リストを取得して内容を確認
worker = df.iloc[0:10,0:1]
worker = worker.transpose() #行列を入れ替え
worker = worker.iloc[0,0:].values
print(worker)
#休日数を取得
holiday = df.iloc[2:12,32:33]
holiday = holiday.transpose() #行列を入れ替え
holiday = holiday.iloc[0,0:].values
print(holiday)
#最低出勤人数を取得
syukkin = df.iloc[11,1:32].values
print(syukkin)
#従業員の希望休を取得
#データ範囲を指定
df2 = df.iloc[0:10,0:32]
print(df2)
# 一致するインデックスと列を格納する空のリストを初期化する
hopeday = []
# テーブルの行を反復処理する
for row_index, row in df2.iterrows():
for cols in df2.columns:
if df2.loc[row_index,cols] == 1:
row_values = df2.loc[row_index, 0]
# col_values = df2.loc[2,cols]
hopeday.append((row_values, cols))
# 結果を出力する
print(hopeday)
出力される結果は次のとおりです。
各コードの説明は次のとおりです・・・
管理人が難しいと感じた部分のみ抽出して説明します。
勤務表を取得
#勤務表を取得
df = df.iloc[6:, 0:]
#インデックスをリセット
df = df.reset_index(drop=True)
#カラム名から"unnamed"を消して数字で付ける
df.columns = [i for i in range(len(df.columns)) ]
従業員名を取得
#従業員リストを取得して内容を確認
worker = df.iloc[0:10,0:1]
#行列を入れ替え
worker = worker.transpose()
#データを取得
worker = worker.iloc[0,0:].values
print(worker)
従業員の希望休を取得
#従業員の希望休を取得
#データ範囲を指定
df2 = df.iloc[0:10,0:32]
print(df2)
# 一致するインデックスと列を格納する空のリストを初期化する
hopeday = []
# テーブルの行を反復処理する
#行を順番に処理してインデックス名を取得
for row_index, row in df2.iterrows():
#列を順番に処理してカラム名を取得
for cols in df2.columns:
#セルが 1 かどうかを判断
if df2.loc[row_index,cols] == 1:
#該当するセルの従業員名を取得
row_values = df2.loc[row_index, 0]
#従業員名と希望休の日付を配列に格納
hopeday.append((row_values, cols))
たったこれだけの事をやるのに・・・
2~3日もかかりヘトヘトです。
管理人にはプログラミングの才能は無いようです。
コメント