Clean Architecture, Clean Life

仕事・個人での技術的なことつぶやきます

【Python】OURAリングAPIでpandasの2.0.x系へ対応していない件に関して

経緯

私は2年前からOURAリングというウェアラブルバイスを利用しています

以下、ChatGPTによる説明文です

Ouraリングは、睡眠、活動、心拍数、体温などの生体データを測定するためのウェアラブルバイスです。このリングは、指に装着することで日常の活動や健康状態をモニタリングすることができます。

Ouraリングは、内蔵されたセンサーを使用してさまざまな生体データを収集します。睡眠中には、睡眠の質や時間を評価し、深い睡眠と浅い睡眠の割合を追跡します。活動中には、歩数や消費カロリーなどのデータを計測します。心拍数を測定することで、心臓の健康状態やストレスレベルを把握することができます。また、体温の変化を記録することで、身体のリズムや体調の変動を把握することも可能です。

Ouraリングは、これらのデータをスマートフォンのアプリに同期させることで、より詳細な解析やレポートを提供します。個々のユーザーに合わせた目標設定やアドバイスも提供される場合があります。

Ouraリングは、個人の健康とフィットネスの管理に役立つツールとして人気があります。睡眠の質や活動量、ストレスレベルなどのデータを追跡することで、生活習慣の改善や健康状態の把握に貢献することが期待されています。

このOURAリングというリングのデータは専用サイトから閲覧できるのに加え、APIが公開されているので、それ経由で取得することも可能です

github.com

私はここから取得したデータをNotionのテーブルにコピーするというスクリプトをGitHubActions上で動かしていたのですが、最近エラーが頻発するようになり、原因を探っていました

原因

エラーの原因はおそらく、OURAのAPIがpandasの2.0.x系へ対応していないために起こったと考えられます

エラー自体はActions上でのみ起こっており、私のローカル環境上では起こっていませんでした

ですので、なにかライブラリのバージョン違いかなと疑っていたところ、pandasのメジャーバージョンが異なっていることに気づき、エラー内容と一致することから更に深ぼって調査していました

ドキュメントを調べてみると、ここで使われているto_datetimeの仕様が2.0.0から変わっているとの記載がありました

pandas.pydata.org

DeepLの翻訳では、

これまで、to_datetime()は、各要素の書式を個別に推測していました。しかし、ユーザーが一貫した書式を期待しているにもかかわらず、関数が要素間で書式を切り替えてしまうような場合には、定期的に問題が発生することがありました。バージョン2.0.0から、解析には一貫したフォーマットが使われるようになりました。

とのことでした

実際にOURA側で持っているデータ自体はエラー内容にあるようにISO8601形式でした(エラーが起こった際のデータでは「2023-04-02T05:40:59+09:00」)

しかし、to_datetimeに渡している引数では「%Y-%m-%d %H:%M:%S」を指定しているので、本来ならばエラーになるところを、pandas1.5.3の仕様上、データの値から推測してよしなに変換してくれていたようです

その型予測が良からぬバグを生んでいたようで、2.0.0から指定したフォーマットどおりでないとエラーが出るように変更されたのですが、逆にその仕様の恩恵を受けていたOURAのAPIでバグが発生してしまっている、という現状のようです

実際to_datetimeのformat引数でISO8601を指定すれば問題なく動作することが確認できました

解決策

こちらでできることとしてはpandasのバージョンを1.5.3に戻すのが一番安いでしょう

というよりOURAのAPIが2.0.xに対応するまではそれ以外に方法はないように思います

現状1.5.3でも問題なく動くので、ライブラリがアップデートされるまではそちらで様子見しようと思います

このAPIを使っている方がどれだけいるかはわからないですが、同じ問題で困っている方の助けになれば幸いです

とおもったら、すでにIssueで困っている方を見かけたので、コメントしておきました^^

github.com

今回も最後まで読んでいただいてありがとうございました