【Streamlit】 st.datetime_inputを活用する

Streamlit
この記事は約16分で読めます。

こんにちは、JS2IIUです。今回は、Pythonで迅速にWebアプリケーションを構築できるライブラリ「Streamlit」の最新アップデート情報をお届けします。

2024年後半から2025年にかけて、Streamlitは急速な進化を遂げてきました。その中でも、バージョン1.52.0でついに導入された「st.datetime_input」は、多くの開発者が待ち望んでいた待望の機能です。

これまで、日付と時間の両方を選択させるには、st.date_inputst.time_inputを組み合わせて配置し、コード側でそれらを結合するという手間が必要でした。しかし、今回のアップデートにより、一つのUIコンポーネントで直感的に日時を指定できるようになりました。

本記事では、中級レベルのPythonプログラマーに向けて、st.datetime_inputの基本的な使い方から、機械学習プロジェクトでの応用例まで、詳細なコードと共に徹底解説します。今回もよろしくお願いします。

1. Streamlit 1.52.0の新機能「st.datetime_input」とは

機械学習モデルのデモやデータ分析ダッシュボードを作成する際、Streamlitは強力な味方です。しかし、過去のバージョンでは「特定の日時(例:2025年1月6日 15時30分)」をユーザーに選ばせる際、UI上の妥協が必要でした。

具体的には、日付選択ウィジェットと時刻選択ウィジェットを横に並べ、それぞれの値をPythonのdatetime.combine()関数で結合するといった処理を自前で書く必要がありました。これは開発効率を下げるだけでなく、モバイル端末などでの操作性(UX)を損なう要因でもありました。

バージョン1.52.0で追加されたst.datetime_inputは、この問題を完璧に解決します。カレンダーから日付を選び、そのまま同じウィジェット内で時刻を調整できる、洗練されたインターフェースを提供します。

Streamlitのアップデート

新機能を試す前にアップデートしておきます。

Bash
# Streamlitを最新バージョンにアップグレード
pip install --upgrade streamlit
Bash
# バージョンの確認
streamlit --version

2. st.datetime_inputの基本仕様

まずは、このウィジェットがどのような引数を取り、何を返すのかを確認しましょう。公式ドキュメントに基づいた基本的な構成は以下の通りです。

Python
st.datetime_input(
    label, 
    value="today", 
    min_value=None, 
    max_value=None, 
    key=None, 
    help=None, 
    on_change=None, 
    args=None, 
    kwargs=None, 
    *, 
    format="YYYY-MM-DD HH:mm:ss", 
    disabled=False, 
    label_visibility="visible", 
    step=60
)

このウィジェットの最大の利点は、戻り値が標準ライブラリの datetime.datetime オブジェクトであることです。これにより、PandasのタイムスタンプやPyTorchでのログ管理、SQLデータベースへのクエリ発行などにそのまま活用できます。

3. 実践:基本的な実装パターン

それでは、実際に動作するコードを見ていきましょう。まずは最もシンプルな実装例です。

基本的な日時の取得

以下のコードは、ユーザーが選択した日時をリアルタイムに画面へ表示する例です。

Python
import streamlit as st
from datetime import datetime

st.title("Streamlit 1.52.0 新機能デモ")

# 基本的な日時入力
# デフォルト値として現在時刻を設定
selected_dt = st.datetime_input(
    "分析開始日時を選択してください",
    value=datetime.now()
)

st.write("選択された日時:", selected_dt)
st.info(f"データ型: {type(selected_dt)}")

このコードを実行すると、美しいカレンダーと時刻入力フィールドが表示されます。valuedatetime.now()を渡すことで、アプリ起動時の時刻が初期値としてセットされます。

選択範囲の制限とステップの設定

次に、より実用的なケースとして「過去の日時は選択不可」にし、「15分刻み」で入力させる設定を紹介します。

Python
import streamlit as st
from datetime import datetime, timedelta

st.subheader("予約システムのシミュレーション")

# 最小値(現在)と最大値(1週間後)を設定
min_dt = datetime.now()
max_dt = min_dt + timedelta(days=7)

# 15分(900秒)間隔での入力を許可
appointment = st.datetime_input(
    "面談希望日時(15分単位)",
    value=min_dt,
    min_value=min_dt,
    max_value=max_dt,
    step=900,  # 秒単位で指定
    help="本日から1週間以内の範囲で選択してください。"
)

st.success(f"予約日時を {appointment.strftime('%Y年%m月%d日 %H時%M分')} に設定しました。")

step引数は秒単位で指定します。step=900とすることで、時刻選択のUIが15分刻みになり、ユーザーの入力ミスを防ぐことができます。これは、サーバーのバッチ処理予約や、アノテーション作業のシフト管理アプリなどに非常に便利です。

4. UI/UXを向上させるカスタマイズ

st.datetime_inputは、見た目のカスタマイズ性も備えています。特に重要なのがformat引数です。

デフォルトでは秒まで表示されますが、業務アプリケーションによっては「秒」の情報が不要な場合もあります。

Python
import streamlit as st
from datetime import datetime

# 年月日と時分のみを表示するフォーマット
custom_format_dt = st.datetime_input(
    "レポート作成日時",
    value=datetime.now(),
    format="YYYY/MM/DD"
)

st.write("表示をカスタマイズしました:", custom_format_dt)

注意点として、format引数に指定する文字列は、Moment.js風のトークン(YYYY, MM, DDなど)を使用します。Python標準のstrftime(%Y-%m-%d)とは異なるため、ドキュメントを確認しながら設定してください。

5. 応用例:機械学習・データ分析での活用シーン

ここからは、中級者の皆様向けに、より実践的な応用例を紹介します。PyTorchを用いた機械学習モデルの推論ログを分析するダッシュボードを想定してみましょう。

大量のログデータから、特定の時間範囲の推論結果(AccuracyやLoss)を抽出するシナリオです。

シナリオ:AIモデル推論ログの期間フィルタリング

以下のコードでは、ユーザーが選択した期間に基づいて、擬似的なログデータをフィルタリングし、可視化します。

Python
import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import matplotlib.pyplot as plt

# ---------------------------------------------------------
# 1. 擬似的な推論ログデータの生成 (PyTorchモデルの出力を想定)
# ---------------------------------------------------------
@st.cache_data
def load_inference_logs():
    # 過去24時間のデータを1分ごとに生成
    base_time = datetime.now() - timedelta(hours=24)
    times = [base_time + timedelta(minutes=i) for i in range(1440)]

    # 精度(Accuracy)の推移をシミュレーション
    accuracies = np.clip(np.random.normal(0.85, 0.05, size=1440), 0, 1)

    return pd.DataFrame({
        "timestamp": times,
        "accuracy": accuracies,
        "model_version": "v1.2.0"
    })

st.title("AI Model Inference Monitor")
df_logs = load_inference_logs()

# ---------------------------------------------------------
# 2. st.datetime_input による期間選択
# ---------------------------------------------------------
st.sidebar.header("表示期間の設定")

start_dt = st.sidebar.datetime_input(
    "開始日時",
    value=datetime.now() - timedelta(hours=6),
    format="YYYY-MM-DD"
)

end_dt = st.sidebar.datetime_input(
    "終了日時",
    value=datetime.now(),
    format="YYYY-MM-DD"
)

# ---------------------------------------------------------
# 3. データのフィルタリングと可視化
# ---------------------------------------------------------
if start_dt > end_dt:
    st.error("エラー: 開始日時は終了日時より前である必要があります。")
else:
    # タイムスタンプでフィルタリング
    mask = (df_logs["timestamp"] >= start_dt) & (df_logs["timestamp"] <= end_dt)
    filtered_df = df_logs.loc[mask]

    st.write(f"### {start_dt} から {end_dt} までの推論ログ")

    if not filtered_df.empty:
        # メトリクスの表示
        avg_acc = filtered_df["accuracy"].mean()
        st.metric("平均推論精度", f"{avg_acc:.2%}")

        # 折れ線グラフの描画
        st.line_chart(filtered_df.set_index("timestamp")["accuracy"])

        # PyTorchモデルの再学習トリガー(UIの例)
        if st.button("この期間のデータでモデルを再学習(Retrain)"):
            st.warning("再学習プロセスを開始します... (これはデモ用ボタンです)")
            # 実際にはここに PyTorch の学習パイプラインを呼び出すコードを記述します
            # example: train_model(filtered_df)
    else:
        st.info("選択された期間にデータは存在しません。")

コードのポイント解説

  1. 直感的なフィルタリング: st.datetime_inputを使うことで、秒単位・分単位での厳密なフィルタリングが可能になります。時系列分析において、特定の障害が発生した「瞬間」前後のデータを抽出する際に極めて有効です。
  2. 動的なバリデーション: start_dt > end_dt のような論理チェックを簡単に行えます。Streamlitのリアクティブな特性により、ユーザーが日時を変更した瞬間にエラーメッセージを表示したり、グラフを更新したりできます。
  3. MLOpsとの親和性: PyTorchなどで構築したモデルが本番環境で稼働している場合、ドリフト(精度の低下)が発生した特定の期間を特定し、そのデータだけを抽出して再学習(Fine-tuning)に回すといったワークフローが、このUI一つで非常にスムーズになります。

6. まとめと今後の展望

今回導入された st.datetime_input は、一見小さな変更に見えるかもしれませんが、Streamlitを用いたアプリケーションの表現力と操作性を大きく向上させる重要なマイルストーンです。

これまでの st.date_inputst.time_input の組み合わせによる「ちぐはぐさ」が解消され、開発者はよりロジックの本質に集中できるようになりました。特に、時間軸が重要な意味を持つ機械学習、IoT、金融データ分析などの分野においては、必須のコンポーネントとなるでしょう。

Streamlitはバージョン1.52.0以降も、より高度なUIコンポーネントの追加が予定されています。最新のドキュメントを定期的にチェックし、あなたのPythonスキルをモダンなWebアプリケーション開発に活かしていきましょう。

参考リンク:

最後まで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました