拠点ごとに祝日が違う会社で、Pythonが勤怠集計の地獄を終わらせた話

勤怠集計の悪夢

毎月25日の朝、出社するとすでに胃の底が重い。全国10カ所の拠点から一斉に送られてくる勤怠データ。各拠点の総務担当者が手入力したExcelファイルだ。これを一つのシートにまとめ、祝日出勤や残業時間を計算し直すのが私の仕事だった。

メールの添付ファイルから10拠点分のExcelを一つずつダウンロードし。マスターシートにコピペしていく。途中で「セルが結合されています」というエラーが出るたびに息が止まりそうになった。A拠点は名前の列がB列なのに。C拠点はC列にあるという微妙なフォーマットの違いに気づかず。全員の残業時間が狂った状態で上司に出して激怒された。

まず、10拠点分のデータを突き合わせるだけで、丸1日がつぶれる。しかも最悪なことに、拠点ごとに「祝日」が違う。カレンダー通りに休む本社。工場のカレンダーに合わせる製造拠点。地元の祭りで休みになる営業所。誰がいつ休むのが正解なのか、担当者の私ですら把握しきれていなかった。毎月、必ず誰かの勤怠計算が狂う。月末の経理部門は、殺気立っていた。

複雑な拠点別祝日と管理の実態

そもそも、なぜ同じ会社なのに祝日がバラバラなのか。理由は複雑に絡み合っていた。本社は暦通りのカレンダーで動いている。しかし、工場を併設している拠点は、お盆や正月に長期休暇を作るため。祝日を平日の出勤日に振り替えているのです。

地域特有の慣習も厄介な問題になる。北海道の拠点では「北海道命名記念日」に合わせた特別な休暇があるし。創立記念日の扱いも拠点ごとに設立年が違うためバラバラだった。これらを一つのシステムで管理しようとすると破綻する。全国一律のカレンダーをシステムに組み込むと。工場勤務の社員が「休日に出勤した」ことになってしまい。莫大な休日割増手当が誤算定される。だからこそ、人事や経理の担当者が、拠点ごとのカレンダーを印刷して机に貼り付け。目視でチェックするしかなかったのだ。視界の端でチラチラと揺れる拠点別カレンダー。これを見比べながらExcelの行をなぞる作業は、人間のやることではありません。

jpholidayで日本の祝日をPythonで自動判定

次に、この地獄を終わらせるため、Pythonの導入を決意した。最初の課題は、ベースとなる「日本の祝日」をどうやってプログラムに認識させるかだ。Pythonには日付を扱うライブラリがいくつもある。海外製のworkcalendarというツールもあるが。日本の複雑な振替休日や「国民の休日」の仕様に完璧に追従するのは難しい。そこで目をつけたのが、jpholidayという日本特化のライブラリだった。

ターミナルを開いてインストールコマンドを打ち込む。たった一行のコードで、指定した日付が祝日かどうかを判定してくれる。振替休日も、春分の日・秋分の日といった年によって変動する祝日も。すべて内部で自動計算される仕組みだ。日付を渡して判定メソッドを呼ぶだけで、「True」か「False」が返ってくる。これだけでも、カレンダーと睨めっこしていた時間が嘘のように短縮される予感がした。

独自休日のExcel管理

ベースの祝日判定ができても。拠点ごとの「独自の休日」をどう管理するかが問題だった。プログラムのコード内に全拠点の創立記念日や工場停止日を直接書き込むのは。最悪の設計だ。なぜなら、来年カレンダーが変わったとき。Pythonのコードを書き直せる人間が私しかいないからです。

一方で、そこで、独自の休日はExcelファイルのマスタとして管理することにした。総務の担当者が「A拠点は10月5日が休み」とExcelに追記するだけで済む。Python側では。pandasというデータ分析ライブラリを使ってこのExcelを読み込む。jpholidayで取得した全国共通の祝日データと。Excelから読み込んだ拠点別の独自休日データを結合するのだ。こうすれば。非エンジニアの総務担当者でも休日カレンダーのメンテナンスが可能になる。現場の運用を変えずに、裏側の処理だけを自動化する。業務改善を定着させるためには、この工夫が欠かせありません。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

PythonでExcel自動化、長年の苦労報われる

材料は出揃った。あとは、各拠点から送られてくる大量のExcelファイルを一気に処理するだけだ。Pythonのglobモジュールを使えば。特定のフォルダに入っているExcelファイルを一括で読み込むことができる。「A拠点_10月勤怠.xlsx」「B拠点_10月勤怠.xlsx」といったファイルをループ処理で順番に開いていく。

読み込んだデータに対し、先ほど作成した拠点別の休日カレンダーを適用する。出勤日と休日を判定し。所定労働時間と実際の打刻時間を引き算して残業時間を割り出す。複雑な条件分岐も、pandasの機能を使えば数行のコードで書けてしまう。最後に、全員分のデータを一つのデータフレームにまとめ。新しいExcelファイルとして書き出す。

そのため、初めて全拠点のループ処理コードを書いて実行ボタンを押したとき。数秒で「処理完了」の文字が出た。恐る恐る出力されたExcelを開くと。1日かけて作っていた集計表が完璧な状態で鎮座していた。思わず「おぉ…」と声が漏れた。このスクリプトが完成したとき、長年の苦労が報われた気がした。

自動化の盲点

しかし、現実の業務は甘くない。スクリプトを導入した最初の月末。自信満々で集計結果を各拠点に送った直後、大阪拠点の総務から連絡が来た。「今月の勤怠、全員1日分ズレています」
血の気が引いた。

原因を突き止めるため、ターミナルにデバッグ用のカレンダー出力を仕込んで実行する。理由は呆気ないものだった。大阪拠点の「創立記念日」は休日に設定していたが。その年たまたま創立記念日が日曜日に被っていた。そのため、翌日の月曜日が「創立記念日の振替休日」となっていたのだ。国民の祝日の振替はjpholidayが対応してくれるが。独自休日の振替までは自動計算されない。Excelのマスタに振替休日分の日付が登録されていなかったことが原因だった。

しかし、すぐさまマスタを更新し、スクリプトを再実行する。手作業ならここから数時間のやり直しだが、プログラムなら数秒で終わる。エラーが起きても即座にリカバリーできるのが、自動化の強みだと痛感した。

Pythonで叶えた5分の業務自動化

マスタの運用ルールを見直し、独自休日の振替ルールも徹底した。それ以降、毎月25日の風景は劇的に変わった。朝出社して、各拠点から送られてきたExcelを特定のフォルダに放り込む。スクリプトを実行し、コーヒーを一口飲む間に処理が終わる。

かつて丸1日かかっていた作業が、たった5分で完結するようになったのだ。上司からは「今月、集計出るの異常に早かったね。何かやった?」と驚かれた。経理部門の空気がピリピリすることもなくなった。現在では。この仕組みを聞きつけた他の部署の担当者から「うちのアルバイトのシフト集計も自動化できないか」と相談を受けるようになっている。Pythonを学んだことで。自分の部署だけでなく会社全体の働き方を変えることができたのです。

Python実務エラーの壁と学び方

さらに、ここまでの道のりは、決して平坦なものではなかった。非エンジニアがpandasやjpholidayを触り始めると。必ず「意味不明なエラー」の壁にぶつかる。

とくに苦しんだのが、Excelの空欄セルの扱いだった。文字列の空欄と、日付データの空欄(NaT)と。数値の空欄(NaN)の違いが分からず。集計の合計値がおかしくなる現象に悩まされた。Googleで調べても英語のドキュメントばかり出てきて。モニターの前で途方に暮れた夜は数え切れありません。

Windows特有の文字コード問題にも直面した。CSVやExcelを読み込む際。SJISとUTF-8の違いで文字化けが発生するのだ。これらは、プログラミングの文法そのものというより。実務データを扱う上での落とし穴である。独学で乗り越えるのは相当な根気がいる。体系的に学ぶなら、実務向けに書かれた書籍や。エラーの解決方法をプロに聞ける環境を用意するのが近道になる。Amazonで評価の高い実務向けPython書籍を片手に試行錯誤するのも良いし。侍エンジニアのようなスクールで自分の業務データを題材にしながら直接指導を受けるのも確実な方法だ。基礎を固めるだけでも、視界は大きく開けるはずです。

多拠点勤怠自動化:3ステップで残業激減

まず、複雑な多拠点の勤怠集計を自動化する流れは、以下の3つのステップに集約される。一つ目は、jpholidayを使って全国共通の祝日ベースラインを確立すること。二つ目は、非エンジニアでも保守できるExcelファイルで。拠点ごとの独自カレンダーを管理すること。三つ目は、pandasを活用して。各拠点の勤怠データと休日カレンダーを一括で突き合わせ、集計を自動化すること。

この仕組みさえ作ってしまえば、月末の残業地獄から確実に抜け出せる。最初はエラーの連続かもしれないが、一度動くものができれば。そのスクリプトは文句一つ言わずに毎月働き続けてくれる。もし月末のExcel集計作業の効率化に関心があるなら。月末コピペ地獄をpandasで卒業した記事も読んでみてほしい。あなたの机にあるその分厚いファイルの山は、プログラムの力で一掃できる。

関連リンクとチェックリスト

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →