You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Streamlit应用中实现带多ID活跃日期标记的双端日期滑块?

解决Streamlit双端日期滑块+多ID活跃日期标记问题

你需要实现覆盖全局日期范围的双端滑块,同时在界面上标记每个ID对应的Active_date,以下是完整解决方案:

步骤1:数据预处理

先统一转换日期格式,并计算全局的日期范围(最早first_month到最晚last_month):

import streamlit as st
import pandas as pd
import altair as alt

# 示例数据(可替换为你的DataFrame)
data = {
    "id": ["PT1", "PT3"],
    "first_month": ["2011-06-01", "2020-09-01"],
    "last_month": ["2019-10-01", "2022-06-01"],
    "Active_date": ["2015-10-01", "2021-10-01"]
}
df = pd.DataFrame(data)

# 日期格式转换
df['first_month'] = pd.to_datetime(df['first_month'])
df['last_month'] = pd.to_datetime(df['last_month'])
df['Active_date'] = pd.to_datetime(df['Active_date'])

# 计算全局日期范围(转为date类型适配Streamlit滑块)
global_min_date = df['first_month'].min().date()
global_max_date = df['last_month'].max().date()

步骤2:实现双端日期滑块

Streamlit的slider组件支持传入元组作为value参数,直接实现双端范围选择:

# 双端日期滑块
selected_range = st.slider(
    "选择日期范围",
    min_value=global_min_date,
    max_value=global_max_date,
    value=(global_min_date, global_max_date),  # 默认选中全局范围
    format="MMM DD, YYYY"
)

# 将选中范围转为datetime格式,方便后续数据过滤
start_range, end_range = pd.to_datetime(selected_range[0]), pd.to_datetime(selected_range[1])

步骤3:可视化多ID的活跃区间与标记点

用Altair创建交互式时间轴,清晰展示每个ID的first_month到last_month区间,并标记Active_date:

# 构造可视化所需数据
# 1. 区间数据:每个ID的起始和结束日期
interval_data = df.melt(
    id_vars='id',
    value_vars=['first_month', 'last_month'],
    var_name='date_type',
    value_name='date'
)

# 2. 活跃日期标记数据
active_data = df[['id', 'Active_date']].rename(columns={'Active_date': 'date'})

# 创建交互式图表
chart = alt.Chart(interval_data).mark_line(size=4).encode(
    x=alt.X('date:T', title='日期'),
    y=alt.Y('id:N', title='ID'),
    color=alt.Color('id:N', legend=None)
)

# 添加活跃日期标记点(红色圆点)
points = alt.Chart(active_data).mark_circle(size=100, color='red').encode(
    x='date:T',
    y='id:N',
    tooltip=[alt.Tooltip('id:N'), alt.Tooltip('date:T', format='%Y-%m-%d')]
)

# 组合图表并添加滑块范围筛选
final_chart = (chart + points).transform_filter(
    (alt.datum.date >= start_range) & (alt.datum.date <= end_range)
).properties(width=700, height=200)

# 渲染图表
st.altair_chart(final_chart, use_container_width=True)

额外:展示选中范围匹配的ID详情

如果需要展示当前滑块范围内的ID信息,可添加以下代码:

# 筛选出区间与选中范围有重叠的ID
filtered_df = df[
    (df['last_month'] >= start_range) & (df['first_month'] <= end_range)
]

st.subheader("当前日期范围覆盖的ID信息")
st.dataframe(filtered_df.style.highlight_max(axis=0))

关键说明

  • 双端滑块的核心是给st.slider的value参数传入元组,返回的selected_range为包含起始/结束日期的元组
  • Altair实现的时间轴支持交互,鼠标悬停可查看活跃日期详情,且会自动根据滑块范围过滤显示内容
  • 所有日期处理统一用pd.to_datetime,避免格式不匹配问题

内容的提问来源于stack exchange,提问作者user14269252

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:29