こんにちは、JS2IIUです。今回は、Pythonで迅速にWebアプリケーションを構築できるライブラリ「Streamlit」の最新アップデート情報をお届けします。
2024年後半から2025年にかけて、Streamlitは急速な進化を遂げてきました。その中でも、バージョン1.52.0でついに導入された「st.datetime_input」は、多くの開発者が待ち望んでいた待望の機能です。
これまで、日付と時間の両方を選択させるには、st.date_inputとst.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のアップデート
新機能を試す前にアップデートしておきます。
# Streamlitを最新バージョンにアップグレード
pip install --upgrade streamlit# バージョンの確認
streamlit --version2. st.datetime_inputの基本仕様
まずは、このウィジェットがどのような引数を取り、何を返すのかを確認しましょう。公式ドキュメントに基づいた基本的な構成は以下の通りです。
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. 実践:基本的な実装パターン
それでは、実際に動作するコードを見ていきましょう。まずは最もシンプルな実装例です。
基本的な日時の取得
以下のコードは、ユーザーが選択した日時をリアルタイムに画面へ表示する例です。
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)}")
このコードを実行すると、美しいカレンダーと時刻入力フィールドが表示されます。valueにdatetime.now()を渡すことで、アプリ起動時の時刻が初期値としてセットされます。
選択範囲の制限とステップの設定
次に、より実用的なケースとして「過去の日時は選択不可」にし、「15分刻み」で入力させる設定を紹介します。
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引数です。
デフォルトでは秒まで表示されますが、業務アプリケーションによっては「秒」の情報が不要な場合もあります。
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モデル推論ログの期間フィルタリング
以下のコードでは、ユーザーが選択した期間に基づいて、擬似的なログデータをフィルタリングし、可視化します。
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("選択された期間にデータは存在しません。")コードのポイント解説
- 直感的なフィルタリング:
st.datetime_inputを使うことで、秒単位・分単位での厳密なフィルタリングが可能になります。時系列分析において、特定の障害が発生した「瞬間」前後のデータを抽出する際に極めて有効です。 - 動的なバリデーション:
start_dt > end_dtのような論理チェックを簡単に行えます。Streamlitのリアクティブな特性により、ユーザーが日時を変更した瞬間にエラーメッセージを表示したり、グラフを更新したりできます。 - MLOpsとの親和性: PyTorchなどで構築したモデルが本番環境で稼働している場合、ドリフト(精度の低下)が発生した特定の期間を特定し、そのデータだけを抽出して再学習(Fine-tuning)に回すといったワークフローが、このUI一つで非常にスムーズになります。
6. まとめと今後の展望
今回導入された st.datetime_input は、一見小さな変更に見えるかもしれませんが、Streamlitを用いたアプリケーションの表現力と操作性を大きく向上させる重要なマイルストーンです。
これまでの st.date_input と st.time_input の組み合わせによる「ちぐはぐさ」が解消され、開発者はよりロジックの本質に集中できるようになりました。特に、時間軸が重要な意味を持つ機械学習、IoT、金融データ分析などの分野においては、必須のコンポーネントとなるでしょう。
Streamlitはバージョン1.52.0以降も、より高度なUIコンポーネントの追加が予定されています。最新のドキュメントを定期的にチェックし、あなたのPythonスキルをモダンなWebアプリケーション開発に活かしていきましょう。
参考リンク:
最後まで読んでいただきありがとうございます。


コメント