如何在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)
关键说明
pd.to_datetime的errors='coerce'参数会把无法解析的字符串(比如'NaN')转为NaT,有效日期则转为标准datetime64类型,避免手动解析的报错。- 用
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
相关产品推荐
相关产品推荐

