如何用Python获取Excel中满足筛选条件的单元格行号
解决Excel按Name和Hour筛选并获取行号的问题
问题分析
你遇到的Hour列显示1970-01-01,是因为pd.to_datetime()会给纯时间的数值自动补充默认日期(1970-01-01),但你的Excel里实际只有时分秒的时间数据,不需要日期部分。我们需要针对纯时间类型做针对性处理,再完成筛选逻辑。
解决方案步骤
1. 正确读取并转换Hour列
针对Excel中的纯时间数据,有两种可靠处理方式:
方式一:转换为timedelta类型(仅保留时分秒)
适合Excel中Hour列是时间格式的场景:
import pandas as pd # 读取Excel数据(仅读取的话不需要提前创建ExcelWriter) df = pd.read_excel(file_name, sheet_name="Today") # 将Hour列转为timedelta类型,自动识别Excel时间格式 df['Hour'] = pd.to_timedelta(df['Hour']) # 构建筛选条件:Name为John,且Hour等于12小时0分0秒 filtered_rows = df[(df["Name"] == "John") & (df['Hour'] == pd.Timedelta(hours=12))]
方式二:提取时间字符串匹配
适合Excel中Hour列是文本格式(如"12:00:00")的场景:
import pandas as pd df = pd.read_excel(file_name, sheet_name="Today") # 将Hour列转为HH:MM:SS格式的字符串 df['Hour'] = pd.to_datetime(df['Hour']).dt.time.astype(str) # 直接匹配时间字符串 filtered_rows = df[(df["Name"] == "John") & (df['Hour'] == "12:00:00")]
2. 获取对应Excel行号
注意:pandas的DataFrame默认从0开始索引,而Excel行号从1开始,需根据表头位置调整:
- 如果Excel表头在第1行,数据从第2行开始:
# 计算对应Excel实际行号 excel_row_numbers = filtered_rows.index + 2 print(excel_row_numbers) - 如果Excel无表头,数据从第1行开始:
excel_row_numbers = filtered_rows.index + 1 print(excel_row_numbers)
完整示例代码
以方式一为例(适配Excel时间格式场景):
import pandas as pd file_name = "你的文件路径.xlsx" df = pd.read_excel(file_name, sheet_name="Today") # 转换Hour列为timedelta类型 df['Hour'] = pd.to_timedelta(df['Hour']) # 执行筛选 filtered_data = df[(df["Name"] == "John") & (df['Hour'] == pd.Timedelta(hours=12))] # 获取Excel行号(假设表头在第1行) target_row_numbers = filtered_data.index + 2 print("匹配的Excel行号:", target_row_numbers.tolist())
注意事项
- 仅读取数据时无需创建
pd.ExcelWriter,这个对象仅用于写入/追加Excel内容。 - 如果Excel中
Hour列混合了时间格式和文本格式,建议先在Excel中统一格式后再处理。
内容的提问来源于stack exchange,提问作者Bireysel Finans
相关产品推荐
相关产品推荐

