使用Python筛选CSV中未来入职日期(DOH)结果异常问题排查
问题:筛选CSV中入职日期晚于今日的记录结果与预期相反
需要校验CSV文件中的入职日期(DOH),筛选出日期晚于今日的异常记录并导出至Excel文件,但运行代码后得到的却是早于今日的记录,与预期相反。CSV文件的日期格式为MM/DD/YYYY,怀疑问题出在dt.datetime.today().strftime('%m/%d/%Y')这一行。
原代码如下:
import pandas as pd import datetime as dt # Read csv file df=pd.read_csv("data.csv", engine="python", header=None) # Add column header names df.columns=["EmployeeID", "LastName", "FirstName", "DOB", "Email", "Salary", "DOH", "TermDate"] # Determine which Dates of Hire are earlier than today's date df0 = df.loc[df["DOH"] > (dt.datetime.today().strftime('%m/%d/%Y')), ["EmployeeID", "LastName", "FirstName", "DOH"]] # Print dataframe output to separate worksheet within one Excel file with pd.ExcelWriter("ErrorOutput.xlsx") as writer: df0.to_excel(writer, sheet_name="Incorrect DOH", index=False)
问题原因与修复方案
核心问题
你当前是在做字符串比较而非真正的日期比较:
- CSV读取后
DOH列默认是字符串类型,dt.datetime.today().strftime('%m/%d/%Y')生成的也是字符串 - 字符串比较按字典序进行,比如"01/15/2025"和"12/31/2024"比较时,因"0" < "1"会错误判定"01/15/2025" < "12/31/2024",导致筛选逻辑完全混乱。
修复步骤
- 将
DOH列转换为日期类型,匹配CSV的MM/DD/YYYY格式 - 使用日期对象而非字符串进行比较,避免字典序干扰
修改后的代码
import pandas as pd import datetime as dt # 读取CSV并指定DOH列为日期类型,格式为MM/DD/YYYY df = pd.read_csv("data.csv", engine="python", header=None, parse_dates=["DOH"], date_parser=lambda x: pd.to_datetime(x, format="%m/%d/%Y")) # 添加列名 df.columns = ["EmployeeID", "LastName", "FirstName", "DOB", "Email", "Salary", "DOH", "TermDate"] # 获取今日纯日期(去除时分秒) today = dt.date.today() # 筛选入职日期晚于今日的异常记录 df0 = df.loc[df["DOH"].dt.date > today, ["EmployeeID", "LastName", "FirstName", "DOH"]] # 导出至Excel with pd.ExcelWriter("ErrorOutput.xlsx") as writer: df0.to_excel(writer, sheet_name="Incorrect DOH", index=False)
补充说明
- 如果读取时指定
parse_dates报错,可在读取后单独转换列:df["DOH"] = pd.to_datetime(df["DOH"], format="%m/%d/%Y") - 用
dt.date.today()获取纯日期对象,和DOH提取的日期部分比较,避免时间(时分秒)干扰
内容的提问来源于stack exchange,提问作者db18145
相关产品推荐
相关产品推荐

