本ページの概要
Fitbitで測定した24時間心拍,24時間歩数,睡眠時間を,1週間分取得する方法を学習します。
PythonでFitbitデータを取得する
下記のプログラム「getWeekHR.py」をエディタで開発ディレクトリに作成し,USER_ID ,CLIENT_SECRET をセットします。さらにプログラム末尾の,
today=date(2025, 10, 15)
for var in range(0, 7):
部分をセットします。上記は「2025/10/15から遡って7日間のデータを取得する」という処理になります。
ターミナル上で,
python getWeekHR.py
と入力し,実行する。正常に動作すると,
「23QTVF_HR.csv」のようなファイルが開発ディレクトリに作成される。「getWeekSLEEP.py」,「getWeekSTEP.py」も同様に使用する。
#getWeekHR.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
print('getWeekHR.py')
USER_ID = "hogehoge";
CLIENT_SECRET = "hogehoge"
def requestFitbit(DATE):
rval=""
global auth2_client,USER_ID
fitbit_stats = auth2_client.intraday_time_series('activities/heart', DATE, detail_level='1min')
HRstats = fitbit_stats['activities-heart-intraday']['dataset']
OUTPUT_FILE = USER_ID+"_HR.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write(DATE+",")
for num1 in range(24):
for num2 in range(60):
key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
hr=""
for var in range(0, len(HRstats)):
if str(HRstats[var]['time']) == key:
hr=str(HRstats[var]['value'])
break
csv_file.write(hr)
csv_file.write(",")
csv_file.write("\n")
csv_file.close()
return rval
##################################################
def writeindex():
global USER_ID
OUTPUT_FILE = USER_ID+"_HR.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write(",")
for num1 in range(24):
for num2 in range(60):
key='{:02}'.format(num1)+':{:02}'.format(num2)+':00'
csv_file.write(key)
csv_file.write(",")
csv_file.write("\n")
csv_file.close()
##################################################
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
"""request"""
writeindex()
today=date(2025, 10, 15)
for var in range(0, 7):
stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
print("target: " + stamp)
requestFitbit(stamp)
#getWeekSTEP.py
import sys
import fitbit
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
print('getWeekSTEP')
USER_ID = "hoge";
CLIENT_SECRET = "hoge"
def requestFitbitSteps(DATE):
global auth2_client, USER_ID
fitbit_stats = auth2_client.intraday_time_series('activities/steps', DATE, detail_level='1min')
STEPstats = fitbit_stats['activities-steps-intraday']['dataset']
OUTPUT_FILE = USER_ID + "_STEP.csv"
with open(OUTPUT_FILE, 'a') as csv_file:
csv_file.write(DATE + ",")
for hour in range(24):
for minute in range(60):
key = '{:02}:{:02}:00'.format(hour, minute)
steps = ""
for entry in STEPstats:
if entry['time'] == key:
steps = str(entry['value'])
break
csv_file.write(steps + ",")
csv_file.write("\n")
def writeStepIndex():
OUTPUT_FILE = USER_ID + "_STEP.csv"
with open(OUTPUT_FILE, 'a') as csv_file:
csv_file.write(",")
for hour in range(24):
for minute in range(60):
key = '{:02}:{:02}:00'.format(hour, minute)
csv_file.write(key + ",")
csv_file.write("\n")
# OAuth2 認証
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True,
access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
# 実行処理
writeStepIndex()
today = date(2025, 10, 15)
for i in range(7):
target_date = datetime.strftime(today - timedelta(days=i), '%Y-%m-%d')
print("target: " + target_date)
requestFitbitSteps(target_date)
#getWeekSLEEP.py
import sys
import fitbit
import pandas as pd
import gather_keys_oauth2 as Oauth2
from datetime import datetime, date, timedelta
print('getWeekSLEEP')
USER_ID = "hoge";
CLIENT_SECRET = "hoge"
def requestFitbit(DATE):
rval=""
global auth2_client,USER_ID
#fitbit_stats = auth2_client.intraday_time_series('activities/minutesSedentary', DATE, detail_level='1min')
#HRstats = fitbit_stats['activities-minutesSedentary-intraday']['dataset']
sleep_data = auth2_client.sleep(date=DATE)
#print(DATE+"睡眠データ取得実行しました")
#OUTPUT_FILE = "SLEEP.csv"
OUTPUT_FILE = USER_ID+"_SLEEP.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write(DATE+",")
sleepcnt=len(sleep_data["sleep"])
#print(str(sleepcnt)+"回眠っています")
if sleepcnt>0:
totallength=0;
TAfter=0;
TFall=0;
TAwake=0;
TLessCnt=0;
TLessDur=0;
TEffi=0;
for var in range(0, sleepcnt):
#print("睡眠:"+str(var))
totallength+=sleep_data["sleep"][var]["minutesAsleep"] #総睡眠時間
TAfter+=sleep_data["sleep"][var]["minutesAfterWakeup"]
TFall+=sleep_data["sleep"][var]["minutesToFallAsleep"]
TAwake+=sleep_data["sleep"][var]["minutesAwake"]
TLessCnt+=sleep_data["sleep"][var]["restlessCount"]
TLessDur+=sleep_data["sleep"][var]["restlessDuration"]
TEffi+=sleep_data["sleep"][var]["efficiency"]
#AvgEffi=TEffi/sleepcnt;
AvgEffi=0;
print(str(sleepcnt)+"回の睡眠で総睡眠時間は"+str(totallength)+"分です")
csv_file.write(str(totallength)+","+str(sleepcnt)+","+str(TAfter)+","+str(TFall)+","+str(TAwake)+","+str(TLessCnt)+","+str(TLessDur)+","+str(AvgEffi)+",")
for var in range(0, sleepcnt):
if sleep_data["sleep"][var]["isMainSleep"] == True:
csv_file.write(sleep_data["sleep"][var]["startTime"]+","+str(sleep_data["sleep"][var]["minutesAsleep"])+","+str(sleep_data["sleep"][var]["efficiency"]))
else:
csv_file.write(",,,,,,,,,,,")
print("睡眠データがありません")
csv_file.write("\n")
csv_file.close()
return rval
##################################################
def writeindex():
global USER_ID
#OUTPUT_FILE = "SLEEP.csv"
OUTPUT_FILE = USER_ID+"_SLEEP.csv"
csv_file = open(OUTPUT_FILE, 'a')
csv_file.write("date,totallength,count,AfterWakeup,FallAsleep,Awake,restlessCount,restlessDur,AvgEffic,MainStart,MainLen,MainEffic\n")
csv_file.close()
##################################################
"""Get tokens"""
server = Oauth2.OAuth2Server(USER_ID, CLIENT_SECRET)
server.browser_authorize()
ACCESS_TOKEN = str(server.fitbit.client.session.token['access_token'])
REFRESH_TOKEN = str(server.fitbit.client.session.token['refresh_token'])
#print(ACCESS_TOKEN)
#print(REFRESH_TOKEN)
"""Authorization"""
auth2_client = fitbit.Fitbit(USER_ID, CLIENT_SECRET, oauth2=True, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
"""request"""
#requestFitbit("2022-02-22")
writeindex(); #インデックス記入
#today = datetime.today()
today=date(2025, 10, 15)
for var in range(0, 7):
#day=today + timedelta(days=1)
#print(var+":" + datetime.strftime(yesterday, '%Y-%m-%d'))
stamp=datetime.strftime(today - timedelta(days=var), '%Y-%m-%d')
print("target: " + stamp, end=' ')
requestFitbit(stamp)