製造業で働いているバランが、日頃のデータ分析や自動化する際に使用するPythonコードを、実例を用いて説明していきます。
取り敢えずコードが見たい方は目次で「3. 完成版コードとまとめ」に飛んでください。
▼ Contents
1. 製造業における製造番号
今回は製造番号を自動で変換する実施例を記載していきます。
図1は製品の製造番号例を示しています。製造番号には主に日付や関連するシリーズ番号、そして製造番号が付随されます。

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

日付表記がJulainから通常表記になっていたり、シリーズ番号がなかったりなど、そのままではよくわからないデータ構成となっているので、このデータを元の製造番号に自動で復元していきたいと思います。
2.製造番号の復元手順
以下の手順で行います。
- 復元する簡略化された製造番号を入力する
- 日付をJulian表記に戻す
- シリーズ番号を付け加える
2-1. 復元する簡略化された製造番号を入力する
これは簡単ですね。input関数を使用して数値を入力できるようにします。なお、ここでは入力する数字長を制限するため、Nという変数を使用します。
N = 10
serial = input("Please input serial number ({} digit): ".format(N))
すると、図3のように入力を求められます。なお、ここで入力した数値はint型でなく、str型として扱われることに注意します。

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″を変換していきます。
上記コードを入力すると、以下のような出力結果を得ます。

次にこのデータから、Julianデータを抽出するため、以下のコードを利用します。これはdatetimeデータに関する内容をまとめた形で出力することができます。
datetime.datetime.strptime(serial[0:6], fmt).timetuple()
出力結果はこちらです。

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で自動化するに限りますね。
本コードを参考に、普段の業務で自動化できる箇所が増えていただけたら幸いです。
それでは。

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

Twitterもやってまーす。
私の自己紹介ページです。