Python Pandas筛选Excel多表中入时间非空、出时间为空的行数据
实现方法
修正现有代码的笔误
你编写的代码中读取第一个工作表的行存在小错误:sheet_name='sheet1'` 多了一个结尾的反引号,会直接触发文件读取报错,先删除这个多余的符号。
核心筛选逻辑
你需要的筛选规则对应两个并行判断条件:
DATE & TIME IN列的单元格存在非空值DATE & TIME OUT列的单元格为空
Pandas中判断单元格空值的标准方法是isna(),对应筛选的布尔逻辑非常简单:
# 对单个DataFrame执行筛选 mask = ( ~df['DATE & TIME IN'].isna() # 逻辑取反,代表该列非空 & (df['DATE & TIME OUT'].isna()) # 判断该列为空 ) filtered_df = df[mask]
常见踩坑提示:
- 如果运行时提示找不到指定列名,大概率是Excel生成的列名前后带了看不见的空白字符,可以在读入每个表格时执行
df.columns = df.columns.str.strip()去掉列名前后的空格,就能正常匹配了- 不要用判断空字符串的方式筛选空值,Excel中的空单元格被Pandas读入后默认值是
NaN,必须用isna()方法才能准确识别,用== ''的方式是筛不出任何数据的
优化版批量处理代码
你现在手动逐个列出10个工作表名称的写法冗余度很高,后续如果工作簿新增工作表,还要手动修改代码。可以直接一次性读取全工作簿的所有工作表,批量完成筛选:
import pandas as pd xl_file = 'excel_workbook.xlsm' # 读取工作簿内全部工作表,返回结构为{工作表名称: 对应数据框}的字典 all_sheets = pd.read_excel(xl_file, sheet_name=None) filtered_result = {} for sheet_name, df in all_sheets.items(): # 统一清理列名前后的空白,避免匹配报错 df.columns = df.columns.str.strip() # 按条件筛选数据行 mask = (~df['DATE & TIME IN'].isna()) & (df['DATE & TIME OUT'].isna()) filtered_df = df[mask] # 存储每个表的筛选结果 filtered_result[sheet_name] = filtered_df # 打印每个表筛选后的前10行,和你原有输出逻辑一致 print(f"----- {sheet_name} 符合条件的前10行数据 -----") print(filtered_df.head(10)) # 如果需要把所有工作表的筛选结果合并成一个总表,执行下面的语句即可 total_filtered = pd.concat(filtered_result.values(), ignore_index=True)
内容的提问来源于stack exchange,提问作者andre
相关产品推荐
相关产品推荐

