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

如何在Pandas中处理含NaN的出生日期列计算年龄?

解决Pandas中含缺失值的出生日期计算年龄问题

核心修改思路

  • 先将字符串形式的'NaN'转换为Pandas的时间缺失值NaT,同时把有效日期转为标准日期类型
  • 通过矢量化操作或带异常处理的自定义函数,自动忽略缺失值,对应结果保留NaN

方案一:矢量化操作(推荐,效率更高)

利用Pandas内置的日期处理能力,直接对整列进行运算,自动跳过缺失值:

import pandas as pd
from datetime import date

dob = {'DOB': ['11/29/1986', 'NaN', '02/23/2006']}
  
# 创建数据框
df33 = pd.DataFrame(data=dob)

# 将DOB列转为日期类型,无效值自动转为NaT(时间缺失值)
df33['DOB'] = pd.to_datetime(df33['DOB'], format="%m/%d/%Y", errors='coerce')

# 计算年龄:自动忽略NaT,对应结果为NaN
today = date.today()
df33['Age'] = today.year - df33['DOB'].dt.year - ((today.month, today.day) < (df33['DOB'].dt.month, df33['DOB'].dt.day))

display(df33)

关键说明

  1. pd.to_datetime的errors='coerce'参数会把无法解析的字符串(比如'NaN')转为NaT,有效日期则转为标准datetime64类型,避免手动解析的报错。
  2. 用dt访问器提取年、月、日,进行矢量化运算,比apply循环效率更高,且NaT对应的计算结果自动为NaN,无需额外判断。

方案二:修改自定义函数(兼容原有逻辑)

如果想保留原有的apply方式,可在函数中加入空值和异常判断:

import pandas as pd
from datetime import datetime, date

dob = {'DOB': ['11/29/1986', 'NaN', '02/23/2006']}
  
df33 = pd.DataFrame(data=dob)

def age(born):
    # 处理空值或字符串形式的NaN
    if pd.isna(born) or born == 'NaN':
        return pd.NA
    # 捕获日期格式错误的情况
    try:
        born_date = datetime.strptime(born, "%m/%d/%Y").date()
        today = date.today()
        return today.year - born_date.year - ((today.month, today.day) < (born_date.month, born_date.day))
    except ValueError:
        return pd.NA

df33['Age'] = df33['DOB'].apply(age)
display(df33)

关键说明

  • 在函数开头判断空值或'NaN'字符串,直接返回缺失值pd.NA
  • 用try-except捕获日期解析失败的异常,确保程序不会中断,错误行同样保留缺失值

内容的提问来源于stack exchange,提问作者weizer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:48:25