使用Python3与Pandas解析Excel长日期查询数据返回空DataFrame问题
解决Pandas筛选Excel长日期返回空DataFrame的问题
问题根源
代码返回空结果,大概率是日期转换不彻底或者pandasql的日期匹配逻辑与Pandas内部datetime格式不兼容导致的。先排查日期转换是否成功,再调整筛选方式。
步骤1:验证日期转换是否正确
先打印转换后的Air date列,确认没有出现NaT(无效时间值):
print(df['Air date'].head()) print(df['Air date'].dtype)
如果输出中有NaT,说明指定的format="%A, %B %d, %Y"和Excel中的日期格式不完全匹配(比如存在多余空格、大小写差异)。可以去掉format参数,让Pandas自动推断格式:
df['Air date'] = pd.to_datetime(df['Air date'], errors='coerce')
errors='coerce'会把无法转换的值转为NaT,方便定位问题行。
步骤2:用Pandas原生筛选替代pandasql(更可靠)
pandasql处理datetime类型时易出现格式匹配问题,直接用Pandas布尔索引筛选更简单:
date_str = "2023-05-01" target_date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date() # 转成date类型,避免时间部分干扰 result = df[df['Air date'].dt.date == target_date] print(result)
如果Air date列转换后包含时间戳(如2023-05-01 00:00:00),用dt.date提取日期部分再匹配,就能规避时间戳的影响。
步骤3:坚持用pandasql的修正方案
pandasql基于SQLite,需将日期转为SQL可识别的格式,或用日期函数匹配:
date_str = "2023-05-01" query = """ SELECT * FROM df WHERE DATE("Air date") = '{}' """.format(date_str) result = sqldf(query) print(result)
用DATE("Air date")提取日期部分,与字符串格式的2023-05-01匹配,避免datetime类型的格式差异。
完整修正代码示例(原生Pandas版本)
#!/usr/bin/env python3 import datetime import pandas as pd # 加载Excel,用第二行做表头 url = "~/Master Broadcast Schedule.xlsx" df = pd.read_excel(url, sheet_name='2023', header=1) # 转换日期列,自动推断格式,处理错误 df['Air date'] = pd.to_datetime(df['Air date'], errors='coerce') # 筛选指定日期 target_date = datetime.datetime.strptime("2023-05-01", '%Y-%m-%d').date() result = df[df['Air date'].dt.date == target_date] print(result)
内容的提问来源于stack exchange,提问作者nwood21
相关产品推荐
相关产品推荐

