You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 21:27:04