如何为DataFrame出生日期列计算年龄并处理缺失/未知值?
我来帮你搞定这个年龄计算的问题!你遇到的核心问题是没法直接处理NOT KNOWN和空值的情况,导致公式运行报错对吧?下面是完整的解决方案,一步步来:
解决方案
1. 先准备好环境与测试数据
首先确保导入必要的模块,同时还原你的示例DataFrame:
import pandas as pd import numpy as np from datetime import datetime # 构造你的示例DataFrame df = pd.DataFrame({ "Date of birth": [ "1957-04-30", "1966-11-10", "1966-11-10", "NOT KNOWN", "1958-10-28", "1958-06-04", None # 模拟空值情况 ] }) # 定义参考日期并转换为datetime对象 referencePeriodEndDate = "2017-03-31" ref_date = datetime.strptime(referencePeriodEndDate, "%Y-%m-%d")
2. 处理出生日期列,统一格式
先把Date of birth列转换成标准日期格式,同时把NOT KNOWN和空值转为缺失值(NaN),这样后续判断更方便:
# 转换日期列,errors='coerce'会把无效值(比如NOT KNOWN、空值)转为NaN df["Date of birth"] = pd.to_datetime(df["Date of birth"], errors="coerce")
3. 计算年龄并处理缺失值
用np.where做条件判断:有效日期就按公式计算年龄,缺失值就返回NOT KNOWN。这里还可以按需保留小数位数:
# 计算年龄,保留1位小数(可根据需求调整) df["Age"] = np.where( df["Date of birth"].notna(), # 判断是否是有效日期 round((ref_date - df["Date of birth"]).dt.days / 365.25, 1), # 计算年龄 "NOT KNOWN" # 无效值返回指定字符串 )
关键逻辑解释
pd.to_datetime(..., errors='coerce'):把所有非日期格式的内容(包括NOT KNOWN和空值)统一转为NaN,让后续的条件判断更简洁。(ref_date - df["Date of birth"]).dt.days:日期相减得到时间差对象,用.dt.days提取具体天数,才能做除法计算年龄。np.where:比循环或apply更高效的矢量判断,适合批量处理DataFrame数据。
最终结果
运行后你的DataFrame会变成这样:
Date of birth Age 0 1957-04-30 59.9 1 1966-11-10 30.4 2 1966-11-10 30.4 3 NaN NOT KNOWN 4 1958-10-28 58.4 5 1958-06-04 58.8 6 NaN NOT KNOWN
内容的提问来源于stack exchange,提问作者Stacey
相关产品推荐
相关产品推荐

