工数集計をPythonで自動化する方法【製造業向け】担当者別・工程別の集計コード付き

各オペレータから集まった工数を集計するのが毎月面倒。なにか良い方法ないかな?

月末になると、担当者ごとのExcelシートを集めて工数を集計する作業が始まる——そんな経験はありませんか。

Aさんのシートを開いて、Bさんのシートを開いて、数字をコピペして合計を出して…。それだけで1〜2時間かかることもあります。工数を集計するために工数を使っている、という状態です。

私が製造業の生産管理を担当していた頃、月末の工数集計は「誰かがやらなければならない作業」でした。

しかも担当者によって入力フォーマットが微妙に違って、毎月同じ問題で詰まる。そういう状況が2年ほど続いていました。

その間にプログラミングの勉強を積み重ねました。
そこで学んだ知識を活かして実際に社内でツールを作成しました。

Pythonのpandasを使えば、複数のCSVや同一フォルダのExcelファイルを一括で読み込み、担当者別・工程別に集計して、Excelレポートとして出力するまでを自動化できます。月末1〜2時間の手作業が、コードを1回実行するだけで終わります。

この記事では、製造業・プロジェクト管理向けの工数集計自動化の実装コードを解説します。

この記事を読むとできること

・工数CSVをpandasで読み込んで確認する
・担当者別・工程別に工数を集計する(groupby・pivot_table)
・月ごとの工数推移を集計する
・集計結果をExcel形式で出力する
・担当者ごとの入力フォーマットのズレに対処する

工数集計に必要なCSV読み込みの基礎はこちらで解説しています。
PythonでCSVを読み込む方法【製造業向け】Shift-JIS・複数ファイル対応コード付き

工数集計の手作業コストとPython自動化のメリット

よくある工数管理の実態

製造業やプロジェクト管理の現場では、こういう状況がよくあります。

  • 担当者ごとに「工数記録.xlsx」を共有フォルダに保存している
  • 月末になると誰かがすべてのファイルを開いて、担当者別・工程別に数字をまとめる
  • まとめた結果を上司に提出するExcelを別途作成する

手作業の集計は「誰がいくらの工数を、どの工程に使ったか」が一目でわかりません。ファイルを10個以上開いてコピペを繰り返すのは、ミスも起きやすいのです。

Pythonで何が変わるか

Pythonで自動化すると、この流れになります。

  1. 全員が決まったフォルダにCSVを保存する(これは今と同じ)
  2. コードを実行すると全ファイルを読み込んで集計
  3. 担当者別・工程別の集計表をExcelに自動出力

実行時間はファイルが20〜30本あっても1分かかりません。

準備:工数データのCSV形式を確認する

想定するCSVの列構成

この記事では、以下の列構成を想定しています。

列名内容
日付作業した日付2026-04-15
担当者作業者の名前山田 太郎
工程作業内容・工程名設計・製造・検査・事務
工数作業時間(時間単位)3.5
備考任意のメモ

実際の列名は現場に合わせてコード内の変数を変更してください。

pandasでの読み込みと確認

import pandas as pd

df = pd.read_csv("kousuu_data.csv", encoding="cp932")

print(df.head())
print(df.dtypes)
print(f"合計行数:{len(df)}行、合計工数:{df['工数'].sum():.1f}時間")

読み込んだ後は必ず dtypes で「工数」列が float64 または int64 になっているか確認してください。object になっていたら文字や空白が混入しています。

集計コード:担当者別・工程別に集計する

担当者別の工数合計(groupby)

最もよく使う集計です。誰がどれだけの工数を使ったかを一覧にします。

# 担当者別の工数合計
tantousha_kousuu = df.groupby("担当者")["工数"].sum().reset_index()
tantousha_kousuu.columns = ["担当者", "合計工数(時間)"]
tantousha_kousuu = tantousha_kousuu.sort_values("合計工数(時間)", ascending=False)

print(tantousha_kousuu)

ascending=False で工数が多い順に並べています。上司への報告時に「誰が何時間使っているか」が一目でわかります。

工程別・担当者×工程のクロス集計(pivot_table)

「誰がどの工程に何時間使っているか」を一覧にしたい場合は pivot_table が便利です。

# 担当者×工程のクロス集計
cross_table = df.pivot_table(
    index="担当者",
    columns="工程",
    values="工数",
    aggfunc="sum",
    fill_value=0      # 値がない場合は0
)

print(cross_table)

行が担当者、列が工程のマトリクス表が出力されます。特定の工程に工数が偏っていないかを確認するのに使えます。

月ごとの工数推移集計

日付列が入っている場合は、月ごとの集計もできます。

# 日付を月に変換して月次集計
df["月"] = pd.to_datetime(df["日付"]).dt.to_period("M")

monthly = df.groupby(["月", "担当者"])["工数"].sum().unstack(fill_value=0)
print(monthly)

dt.to_period("M") で日付を「年月」単位に変換してから集計します。月ごとの推移が担当者別に確認できます。

出力:Excelレポートを生成する

集計結果をExcelに書き出す

# 複数シートにまとめてExcel出力
with pd.ExcelWriter("kousuu_report.xlsx") as writer:
    tantousha_kousuu.to_excel(writer, sheet_name="担当者別集計", index=False)
    cross_table.to_excel(writer, sheet_name="担当者×工程")
    monthly.to_excel(writer, sheet_name="月次推移")

print("kousuu_report.xlsx を出力しました")

pd.ExcelWriter を使うと複数のシートを1つのExcelファイルにまとめて出力できます。「担当者別集計」「担当者×工程」「月次推移」の3シート構成が月次報告に使いやすい形です。

よくある工数集計の問題と対処

入力フォーマットが担当者ごとに違う場合

担当者によって「山田太郎」「山田 太郎」「yamada」など表記が揺れている場合は、読み込み後に名寄せが必要です。

# 氏名の空白を除去して統一
df["担当者"] = df["担当者"].str.strip().str.replace(" ", "")  # 全角スペースも除去

# 特定の表記を統一する場合
df["担当者"] = df["担当者"].replace({
    "yamada": "山田 太郎",
    "山田太郎": "山田 太郎"
})

欠損値・空白セルへの対処

工数が未記入の行が混入している場合は、事前に除外または0埋めします。

# 工数が空白の行を除外
df = df.dropna(subset=["工数"])

# または 0 で埋める
df["工数"] = df["工数"].fillna(0)

読み込んだデータで何をするか

工数集計と合わせて活用できる関連記事です。

日報データと工数データをまとめて集計する実装例はこちらです。
日報をPythonで自動集計する方法【コピペOK】製造業・事務系向けの実装コード

集計結果をStreamlitでダッシュボード表示したい場合はこちらです。
【製造業Python】Streamlitで業務アプリを作る方法|入力フォーム・CSV集計コード付き

まとめ

迷ったらまず「担当者別のgroupby集計」から試してみてください。これだけでも月末の手集計を大幅に削減できます。

製造業・プロジェクト管理の工数集計に使う主なpandas関数はこれだけです。

やりたいこと使うコード
担当者別の合計df.groupby("担当者")["工数"].sum()
担当者×工程のクロス集計df.pivot_table(index="担当者", columns="工程", values="工数", aggfunc="sum")
月次推移df["月"] = pd.to_datetime(df["日付"]).dt.to_period("M")
Excel出力(複数シート)pd.ExcelWriter("report.xlsx")
欠損値除去df.dropna(subset=["工数"])
表記ゆれ名寄せdf["担当者"].replace({...})

製造業でPythonを使った自動化の全体像はこちらで解説しています。
製造業でPythonを使って自動化する方法|非エンジニアが現場で実践した5場面