Pandas按指定日期筛选DataFrame返回空结果的原因排查
问题原因及解决方法
核心原因
筛选后返回空DataFrame的关键问题是类型不匹配:
- 经过
pd.to_datetime()转换后,df["datum"]的类型是Timestamp(即使原数据只有日期,也会默认带上00:00:00的时间部分); - 而你传入的
date参数是字符串类型,直接用==比较时,字符串和Timestamp无法匹配,导致筛选结果为空。
解决方法
方法1:将传入的字符串日期转为Timestamp类型
直接把date参数也转换成datetime类型,让两边类型统一后再比较:
def select_by_date(df: pd.DataFrame, date: str = None): if date: log.info(f"Using data from {date}") df["datum"] = pd.to_datetime(df['datum']) # 将date转为Timestamp后再比较 return df.loc[(df["datum"] == pd.to_datetime(date))] else: log.warn(f"No date provided") return input_sendungen
方法2:提取日期部分进行比较(适用于datum列包含具体时间的场景)
如果你的datum列转换后不仅有日期,还有具体时分秒(比如2021-04-21 14:30:00),可以提取日期部分再和目标日期对比:
def select_by_date(df: pd.DataFrame, date: str = None): if date: log.info(f"Using data from {date}") df["datum"] = pd.to_datetime(df['datum']) # 提取datum列的日期部分,和目标日期的date对象比较 target_date = pd.to_datetime(date).date() return df.loc[(df["datum"].dt.date == target_date)] else: log.warn(f"No date provided") return input_sendungen
额外注意事项
- 确保传入的
date字符串格式和datum列转换前的格式一致(比如都是YYYY-MM-DD),避免转换失败; - 如果不想修改原DataFrame的
datum列类型,可以用临时转换的方式,比如df['datum'].astype('datetime64[ns]')代替直接赋值。
内容的提问来源于stack exchange,提问作者daniel guo
相关产品推荐
相关产品推荐

