1. はじめに
IoT組込みエンジンNEQTOでは、世界中にサービスを提供するために、データの取得時間を世界標準である協定世界時 (UTC)の1970年1月1日午前0時0分0秒からの経過時間 (ミリ秒)を採用しています。
これはUNIX時間やPOSIX timeなどと呼ばれていますが、人間が見て時間を認識できるものではなくただの数値のため、人間にわかりやすい形式にするために地域や表示形式を考慮して変換する必要があります。
今回は、Pythonを使用して、NEQTOから取得した時間データを人間が見て分かる時間形式(※)に変更し、そのデータをExcel形式に変換する方法をご紹介します。
※ 例えば、NEQTOから返されるtimestampの値が 0 の場合、以下のような表記に変換します
- 日本標準時間に変換する場合:1970/01/01 09:00:00
- 太平洋標準時に変換する場合:December 31, 1969 16:00:00 (PM)
2. NEQTO Infinitypoolから、時間データとセンサーデータを取得
NEQTOでは、対象のAPIに記載されているAPIから、データを取得することができます。今回は、デバイスが送信した時間(timestamp) とセンサーデータ(value) を利用します。このAPIをリクエストするための詳細な方法は、APIの利用方法に詳しく書かれているため、こちらをご覧ください。
3. 国や地域を考慮した時間データを、Excelで出力する
デバイスが送信した時間とセンサーのデータを取得したら、次はこのデータをExcelで出力します。Excelで出力する事で、IoTデバイスが取得したデータをさまざまな分析に活用する事ができます。今回ご紹介する実行環境は、以下の通りです。
3.1 仕様
- 2022/04/18 12:00(JST)からデータを10件取得し、Excelに保存します。
- 日本時間で、YYYY/MM/DD HH:MM:SS の形式で保存します。
- 各センサーデータは、次の列に変換してExcelに保存します。
- DATETIME: YYYY/MM/DD HH:MM:SS
- VALUE: センサーデータ
3.2 環境
- MacOS 12
- Python 3.8
- サードパーティーライブラリー
- requests==2.27.1
- pytz==2022.1
- openpyxl==3.0.9
3.3 サンプルコード
このスクリプトをお手元の環境で実行する場合、コードの中にあるsettingsパラメーターを、利用する環境に合わせ、置き換えてください。タイムゾーンや時間のフォーマットを変更する場合、「TIME_ZONE」や「NUMBER_FORMAT」を目的のものに変更してください。
プログラムの流れは、下記の通りになります。
- get_token関数で、APIをリクエストするためのトークンを取得する。
- get_data_from_infinitypool関数で、対象のデータを取得する。
- save_escel関数で、時間を目的のフォーマットへ変換し、 Excelへ結果を保存する。
import datetime
import requests
import pytz
import openpyxl
import settings
TIME_ZONE = 'Asia/Tokyo'
NUMBER_FORMAT = 'yyyy/mm/dd hh:mm:ss'
def get_token():
auth = requests.post(
'https://auth.neqto.com/account/api-token-auth',
json={'company_code': settings.COMPANY_CODE,
'email': settings.EMAIL, 'password': settings.PASSWORD})
data = auth.json()
return data['token']
def get_data_from_infinitypool(token):
url = 'https://asia-pacific-1.neqto.com/groups/{groups_group_id}/nodes/{node_id}/components/{object_id}/{resource_id}/{instance_id}/json'.format(
groups_group_id=settings.GROUP_ID,
node_id=settings.NODE_ID,
object_id=settings.OBJECT_ID,
resource_id=settings.RESOURCE_ID,
instance_id=settings.INSTANCE_ID)
params = {
'from_time': settings.FROM_TIME,
'to_time': settings.TO_TIME,
'sort': 'asc',}
headers = {
'Authorization': f'JWT {token}'
}
res = requests.get(url, params=params, headers=headers)
data = res.json()
return data['results']
def save_excel(data):
wb = openpyxl.Workbook()
ws = wb.active # Sheet
tz = pytz.timezone(TIME_ZONE)
# HEADER
ws.cell(column=1, row=1, value='DATETIME')
ws.cell(column=2, row=1, value='VALUE')
# DATA
for i, d in enumerate(data, 2):
# DATETIME
timestamp = datetime.datetime.fromtimestamp(d['timestamp']/1000, tz)
dt = timestamp.replace(tzinfo=None)
cell = ws.cell(column=1, row=i, value=dt)
cell.number_format = NUMBER_FORMAT
# VALUE
ws.cell(column=2, row=i, value=d['value'])
wb.save('sample.xlsx')
if __name__ == '__main__':
token = get_token()
data = get_data_from_infinitypool(token)
save_excel(data)
3.4 実行結果
Excelの出力結果は、このようになりました。
4. まとめ
いかがでしたでしょうか。今回は使われる国や地域を考慮して、時間データをExcelに保存するスクリプトをご紹介しました。
Excelになったことで、Excelのグラフを使用したりBIツールにインポートすることで、より深い分析が可能になります。ぜひご参考ください。
今回のスクリプトは、NEQTOから得られるtimestampの情報 1650250814205 (例) を、タイムゾーンを考慮しながら「2022/4/18 12:00:14」へ変換し保存しています。
年月日を「/」で区切る形式にしましたが、この形式では使われる国を考慮して変更する必要があります。例えば、アメリカなら「4/18/2022」、イギリスなら「18/4/2022」といった形式にする必要がありますので、どの形式にするかを事前に検討すると良いでしょう。