基于Streamlit的date_input函数筛选DataFrame时出现报错问题咨询
报错核心原因
是时间类型不匹配导致的比较运算失败:
- Streamlit的
st.date_input()组件返回值为Python原生datetime.date类型,仅包含日期维度信息,无时分秒 - 你的DataFrame中
CREATEDDATE列为datetime64[ns]类型(带时分秒的时间戳类型),两类不同的时间格式无法直接进行大小比较,因此触发类型错误
解决方案
有两种常用的适配方案可选:
方案1:将输入的日期转换为pandas datetime类型
import pandas as pd df = ld.load_data_projet() # 转换输入日期为datetime类型 start_date = pd.to_datetime(st.date_input('Date de début :')) end_date = pd.to_datetime(st.date_input('Date de fin :')) if start_date < end_date: # 结束日期补全到当天23:59:59,覆盖当日所有时间范围的数据 end_date = end_date + pd.Timedelta(days=1) - pd.Timedelta(seconds=1) mask = (df['CREATEDDATE'] > start_date) & (df['CREATEDDATE'] <= end_date) df = df.loc[mask] st.dataframe(df) else: st.error('Error: Date de fin doit être choisi après la date de début.')
方案2:将DataFrame的时间列转换为date类型后比较
df = ld.load_data_projet() start_date = st.date_input('Date de début :') end_date = st.date_input('Date de fin :') if start_date < end_date: # 提取时间列的日期部分做比较 mask = (df['CREATEDDATE'].dt.date > start_date) & (df['CREATEDDATE'].dt.date <= end_date) df = df.loc[mask] st.dataframe(df) else: st.error('Error: Date de fin doit être choisi après la date de début.')
额外优化提示
你原有代码中即使日期校验不通过,筛选逻辑依然会执行,建议把筛选、展示表格的逻辑都放到日期校验通过的分支内,避免异常数据输出。
内容的提问来源于stack exchange,提问作者Ib D
相关产品推荐
相关产品推荐

