Pandas日期类型单元格选择及多条件筛选返回空DataFrame问题求助
Pandas日期类型单元格选择及多条件筛选返回空DataFrame问题求助
嗨,看起来你遇到了Pandas多条件筛选时日期匹配失效的问题,我来帮你分析下大概率的原因和对应的解决办法~
首先,单独用Transitioning EIN的条件能拿到结果,说明第一个筛选逻辑没问题,问题肯定出在日期列的匹配上,常见的原因有这几个:
1. 日期列的数据类型与筛选值不匹配
你的筛选值写的是带时分秒的字符串"2021-01-29 00:00:00",但实际数据里的Unnamed: 13列可能:
- 是字符串类型但格式不带时分秒,比如实际存储的是
"2021-01-29" - 是datetime类型,但你用字符串去匹配,导致类型不兼容
解决办法:
先确认日期列的真实情况:
# 查看数据类型 print(df['Unnamed: 13'].dtype) # 查看前几行的实际值 print(df['Unnamed: 13'].head())
如果是字符串类型:
- 可以只匹配日期前缀,不用纠结时分秒:
df.loc[(df['Unnamed: 17']=='Transitioning EIN') & (df['Unnamed: 13'].str.startswith("2021-01-29"))] - 或者先把字符串转成datetime类型,再按日期筛选:
# 转换为datetime类型 df['Unnamed: 13'] = pd.to_datetime(df['Unnamed: 13']) # 匹配当天所有时间点 df.loc[(df['Unnamed: 17']=='Transitioning EIN') & (df['Unnamed: 13'].dt.date == pd.to_datetime("2021-01-29").date())]
如果是datetime类型:
直接用datetime对象去匹配,不要用字符串:
df.loc[(df['Unnamed: 17']=='Transitioning EIN') & (df['Unnamed: 13'] == pd.to_datetime("2021-01-29"))]
(如果原数据带时分秒,上面的代码会只匹配00:00:00的行,要是想匹配当天所有行,就用上面的dt.date方法)
2. 日期列存在时区信息
如果你的Unnamed: 13列是带时区的datetime类型(比如datetime64[ns, UTC]),而你用不带时区的字符串或datetime对象去匹配,就会因为时区不统一导致匹配失败。
解决办法:
统一时区,比如去掉日期列的时区信息:
df['Unnamed: 13'] = df['Unnamed: 13'].dt.tz_localize(None) # 再进行筛选 df.loc[(df['Unnamed: 17']=='Transitioning EIN') & (df['Unnamed: 13'] == pd.to_datetime("2021-01-29"))]
3. 日期字符串存在隐藏空格或特殊字符
有时候数据里的日期字符串可能有前后空格,或者看不见的特殊字符,导致完全匹配失败。
解决办法:
先清理字符串的空格再匹配:
df.loc[(df['Unnamed: 17']=='Transitioning EIN') & (df['Unnamed: 13'].str.strip() == "2021-01-29 00:00:00")]
你可以先按上面的步骤排查下,应该能找到问题所在~
备注:内容来源于stack exchange,提问作者Vish
相关产品推荐
相关产品推荐

