はじめに
勤怠管理はどの会社でも欠かせない業務ですが、Excelで手作業で集計していると時間もかかり、ミスも発生しがちです。
そこで本記事では、Pythonを使って勤怠データを自動集計し、「残業時間」や「有休消化数」を自動でレポート化する方法を解説します。
業務改善やバックオフィス効率化に直結する内容なので、総務・経理担当の方や、社内システムを効率化したいエンジニアの方におすすめです。
使用するライブラリ
今回使用する主要ライブラリは以下のとおりです。
- pandas:ExcelやCSVのデータ処理
- openpyxl:Excelファイルの入出力
- matplotlib:残業時間や有休取得数をグラフ化
pip install pandas openpyxl matplotlib
勤怠データの例
想定する勤怠データはExcelまたはCSVで管理されているものです。例として、以下のような形式を用います。
社員ID | 氏名 | 日付 | 出勤時刻 | 退勤時刻 | 勤務区分 |
---|---|---|---|---|---|
1001 | 田中太郎 | 2025-08-01 | 09:00 | 19:30 | 出勤 |
1001 | 田中太郎 | 2025-08-02 | 09:15 | 18:00 | 出勤 |
1001 | 田中太郎 | 2025-08-05 | NaN | NaN | 有休 |
1002 | 鈴木花子 | 2025-08-01 | 08:50 | 17:40 | 出勤 |
Pythonコード例:残業・有休の自動集計
import pandas as pd
import matplotlib.pyplot as plt
# 勤怠データ読み込み(CSVまたはExcel)
df = pd.read_excel("kintai.xlsx") # CSVの場合は read_csv
# 出退勤の差分(勤務時間)を計算
df["勤務時間(h)"] = (pd.to_datetime(df["退勤時刻"]) - pd.to_datetime(df["出勤時刻"])).dt.total_seconds() / 3600
# 残業時間を計算(1日8時間を超えた分)
df["残業時間(h)"] = df["勤務時間(h)"].apply(lambda x: max(0, x - 8) if pd.notnull(x) else 0)
# 有休取得日数をカウント
df["有休"] = df["勤務区分"].apply(lambda x: 1 if x == "有休" else 0)
# 社員ごとの集計
report = df.groupby(["社員ID", "氏名"]).agg({
"勤務時間(h)": "sum",
"残業時間(h)": "sum",
"有休": "sum"
}).reset_index()
# Excelに出力
report.to_excel("勤怠レポート.xlsx", index=False)
print("勤怠レポートを出力しました!")
出力されるExcelレポート(例)
社員ID | 氏名 | 勤務時間(h) | 残業時間(h) | 有休 |
---|---|---|---|---|
1001 | 田中太郎 | 160.5 | 20.5 | 2 |
1002 | 鈴木花子 | 150.0 | 10.0 | 1 |
グラフ化(残業時間ランキング)
残業時間の多い社員を可視化すると、一目で傾向を把握できます。
# 残業時間ランキング
top_overtime = report.sort_values("残業時間(h)", ascending=False)
plt.bar(top_overtime["氏名"], top_overtime["残業時間(h)"])
plt.title("残業時間ランキング")
plt.xlabel("社員")
plt.ylabel("残業時間(h)")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("残業ランキング.png")
plt.show()
→ このように残業時間が多い社員が棒グラフで一目瞭然になります。
まとめ
- Pythonを使えば、勤怠データから残業時間・有休取得日数を自動集計できる
- Excelに出力すれば上司や管理部門への報告もラクに
- グラフ化することで「誰が残業しすぎか」を直感的に把握可能
手作業で時間をかけていた勤怠管理をPythonで自動化し、より効率的な業務改善を進めてみてください!
✅ 次の発展としては、
- TeamsやSlackに自動通知
- 月次レポートをメール送信
- Webアプリ化(Streamlitなど)
も可能です。