【初心者向け】~製造業~Pythonによる自動化(製造番号編)

製造業で働いているバランが、日頃のデータ分析や自動化する際に使用するPythonコードを、実例を用いて説明していきます。

Baran

私の自己紹介ページです。

やりたいことをやろう

取り敢えずコードが見たい方は目次で「3. 完成版コードとまとめ」に飛んでください。

1. 製造業における製造番号

今回は製造番号を自動で変換する実施例を記載していきます。

図1は製品の製造番号例を示しています。製造番号には主に日付や関連するシリーズ番号、そして製造番号が付随されます。

図1 製造番号例

ただし、データ解析をしたい際に製造番号がそのまま使えることはあまりなく、図2のように簡略化された番号で情報が入ることがよくあります。

図2 簡略化された製造番号例

日付表記がJulainから通常表記になっていたり、シリーズ番号がなかったりなど、そのままではよくわからないデータ構成となっているので、このデータを元の製造番号に自動で復元していきたいと思います。

2.製造番号の復元手順

以下の手順で行います。

  1. 復元する簡略化された製造番号を入力する
  2. 日付をJulian表記に戻す
  3. シリーズ番号を付け加える

2-1. 復元する簡略化された製造番号を入力する

これは簡単ですね。input関数を使用して数値を入力できるようにします。なお、ここでは入力する数字長を制限するため、Nという変数を使用します。

N = 10
serial = input("Please input serial number ({} digit): ".format(N))

すると、図3のように入力を求められます。なお、ここで入力した数値はint型でなく、str型として扱われることに注意します。

図3 入力情報

2-2. 日付をJulian表記に戻す

まず、入力された数値の文字列長がN=10であることを確認します。

if len(serial) != N:
    raise ValueError("Input serial was not {} digit data".format(N))

もし、文字列長がN=10でなければ、エラーを出力するにようにしておきます。

それでは、数値で表された”2104280001″を変換していきます。まずは、入力される時間軽フォーマット”fmt”を指定します。時間系の書式フォーマットはPython公式サイトをご確認ください。

以下のリストは 1989 C 標準が要求する全ての書式コードで、標準 C 実装があれば全ての環境で動作します。

strftime() と strptime() の書式コード
fmt = '%y%m%d' 
datetime.datetime.strptime(serial[0:6], fmt)

ここでは、入力した数値の0から6番目までの数値、つまり”210428″を変換していきます。

上記コードを入力すると、以下のような出力結果を得ます。

図4 出力結果1

次にこのデータから、Julianデータを抽出するため、以下のコードを利用します。これはdatetimeデータに関する内容をまとめた形で出力することができます。

datetime.datetime.strptime(serial[0:6], fmt).timetuple()

出力結果はこちらです。

図5 出力結果2

tm_ydayがJulian表記なので、そのデータを以下のコードで抽出して、j_dayという変数に格納します。これでJulian日付を取得できました。

j_day = datetime.datetime.strptime(serial[0:6], fmt).timetuple().tm_yday

2-3. シリーズ番号を付け加える

最後にデータにシリーズ番号を付与します。注意することは、j_dayは日付によっては、一桁や二桁の数値になるため、”0″という数値が付与されないことです。

この点に注意して、以下のようにコードを記載します。

if 1 <= j_day <= 9:
    print("{0}00{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:]))
elif 10 <= j_day <= 99:
    print("{0}0{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:]))
elif 100 <= j_day <= 366:
    print("{0}{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:]))
else:
    ValueError("Unknown Error")

Julian日付が一桁であれば”00″を付与しておき、Julian日付が二桁であれば”00″を付与しておきます。あとは挿入したデータ配列を意識して、format関数を記載します。これで完成しました。

3. 完成版コードとまとめ

メイン処理を関数化してまとめてみました。

""" product_converter.py """
import datetime


""" シリアル#中間部位の文字列 """     
string_1 = "XXX"  

def production_converter(serial):
    """ datetime format """
    fmt = '%y%m%d'

    if len(serial) != N:
        raise ValueError("Input serial was not {} digit data".format(N))

    j_day = datetime.datetime.strptime(serial[0:6], fmt).timetuple().tm_yday
    if 1 <= j_day <= 9:
        return "{0}00{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:])
    elif 10 <= j_day <= 99:
        return "{0}0{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:])
    elif 100 <= j_day <= 366:
        return "{0}{1}{2}{3}".format(serial[0:2], j_day, string_1, serial[-4:])
    else:
        raise ValueError("Unknown Error")


if __name__ == "__main__":
    N = 10
    print("\n")
    serial = input("Please input serial number ({} digit): ".format(N))
    print("\n" + "-"*15 + "\n" + production_converter(serial) + "\n"+ "-"*15)

データ配列の変更だけであれば、Pythonで自動化するに限りますね。

本コードを参考に、普段の業務で自動化できる箇所が増えていただけたら幸いです。

それでは。

Baran

他の記事もご欄いただけると幸いです。

Twitterもやってまーす。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。