管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

Fitbit APIを叩いて2019年と2020年の睡眠時間を比べてみた

昨日やった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時間/日くらいという感覚があったのですが、週末が平均を押し上げたか?月-金でも集計してみたいですね。
f:id:ksk1130:20210106213755p:plain

参考にしました