Python如何比对Excel生日列月日并输出当天过生日的人员姓名
生日提醒代码修正方案
核心问题说明
- 遍历逻辑错误:仅遍历
Birthday列的数值,无法关联对应行的姓名数据,直接调用df["First Name"]会输出整列所有内容 - 日期匹配逻辑错误:直接比对完整日期(包含年份),不符合仅匹配月、日的需求;且循环内每遇到非生日条目就输出「无人过生日」,逻辑完全错误
- 日期格式未统一:从Excel读取的日期未做标准化转换,存在格式解析风险
修正后完整代码
from datetime import date, timedelta import pandas as pd # 直接用pandas读取Excel,简化代码 df = pd.read_excel("U:\\Python\\untitled\\Birthdaylist.xlsx", sheet_name="Sheet1") # 标准化生日列的日期格式,适配dd.mm.yyyy的日期写法 df["Birthday"] = pd.to_datetime(df["Birthday"], format="%d.%m.%Y") # 获取今日的月、日元组,以及未来3天的时间范围 today = date.today() today_md = (today.month, today.day) future_3d = today + timedelta(days=3) # 存储今日/未来3天过生日的人员,避免循环内重复输出无意义内容 today_birthday = [] coming_birthday = [] # 遍历每一行数据,关联生日和姓名 for _, row in df.iterrows(): bday = row["Birthday"] bday_md = (bday.month, bday.day) # 匹配今日生日 if bday_md == today_md: today_birthday.append(row["First Name"]) # 匹配未来3天内的生日 else: # 构造今年的生日日期用来比对时间范围 this_year_bday = date(today.year, bday.month, bday.day) if today < this_year_bday <= future_3d: coming_birthday.append((row["First Name"], bday.strftime("%m月%d日"))) # 输出结果 if today_birthday: for name in today_birthday: print(f"Today is {name}'s birthday!") else: print("It's no one's birthday today!") if coming_birthday: for name, bday_str in coming_birthday: print(f"{name}'s birthday is on {bday_str}.")
关键修改说明
- 用
iterrows()遍历DataFrame的每一行,可以同时获取当前行的所有列数据,解决姓名和生日无法对应的问题 - 将日期统一转换为
(月, 日)的元组进行比对,自动忽略年份差异,符合生日匹配的需求 - 先收集所有符合条件的人员再统一输出,避免原代码中循环重复输出「无人过生日」的问题
- 直接使用
pandas.read_excel读取文件,简化原来用openpyxl中转的冗余代码
内容的提问来源于stack exchange,提问作者Charlotte
相关产品推荐
相关产品推荐

