
各オペレータから集まった工数を集計するのが毎月面倒。なにか良い方法ないかな?
月末になると、担当者ごとの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で自動化すると、この流れになります。
- 全員が決まったフォルダにCSVを保存する(これは今と同じ)
- コードを実行すると全ファイルを読み込んで集計
- 担当者別・工程別の集計表を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場面