昨日やったFitbitAPI叩こうシリーズ第2弾。睡眠時間編です。
www.k-hitorigoto.online
確認環境
Python 3.8.5 curl 7.29.0
睡眠時間JSONの取得
# Max100日分らしいので、3か月ずつ取得 # 2020/1/1から2020/3/31までの睡眠データを日ごとに取得 curl -i -H "Authorization: Bearer <発行したアクセスキー>" \ https://api.fitbit.com/1.2/user/-/sleep/date/2020-01-01/2020-03-31.json -o sleep_2020_1_3.json
2019年も同様に取得
JSON→CSVに変換
# 上記のJSONを基にCSVを作成するpython3プログラム #!/usr/bin/python3 # -*- coding:utf8 -*- import os import codecs import json from datetime import datetime # yyyy-mm-dd形式の文字列日付から週番号を返す # 新年最初の日曜日の週が1、それより前は0週目 def get_week_no(date_str): date = datetime.strptime(date_str, '%Y-%m-%d') # 年の週番号(週の最初の日は日曜日) 新年の最初の日曜日より前の日付は第0週 return date.strftime("%U") # yyyy-mm-dd形式の文字列日付から月を返す def get_month(date_str): date = datetime.strptime(date_str, '%Y-%m-%d') return date.strftime("%m") # ms -> hの変換(小数第2位まで) def convert_ms_to_h(duration_ms): return round(float(duration_ms) / (1000 * 60 * 60), 2) # JSONからCSVに変換して出力 # yyyy-mm-dd形式の日付,月,週番号,睡眠時間(h) def parse_json_csv(in_json_path, out_csv_path): with codecs.open(in_json_path) as fr, codecs.open(out_csv_path, 'w', 'utf-8') as fw: json_doc = json.load(fr) for elem in json_doc['sleep']: # 'isMainSleep'のデータのみを書き出し if elem['isMainSleep'] == True: # CSV形式で出力 fw.write('{},{},{},{}\r\n'.format(elem['dateOfSleep'],get_month(elem['dateOfSleep']), get_week_no(elem['dateOfSleep']), convert_ms_to_h(elem['duration']))) if __name__ == '__main__': # 環境変数から各種パラメータを取得 in_json_path = os.environ['IN_JSON_PATH'] out_csv_path = os.environ['OUT_CSV_PATH'] parse_json_csv(in_json_path, out_csv_path)
Excelでグラフ描画
Excelで月単位で平均睡眠時間をグラフ描画しました。
想定通り、平均睡眠時間は2020年の方が長いですね。2019年は6時間/日、2020年は7時間/日くらいという感覚があったのですが、週末が平均を押し上げたか?月-金でも集計してみたいですね。
参考にしました