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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:45:04