如何在Pandas中从datetime64[ns]类型出生日期列计算年龄?
解决从datetime64[ns]列计算年龄的TypeError问题
你遇到的这个TypeError很常见——因为你计算出来的age列是timedelta64[ns]类型(包含天、时、分、秒的时间差),这种类型没法直接用astype(int)转换为整数。咱们一步步来修正:
问题根源
你的代码里(now - clients["date_of_birth"])/365得到的是带时分秒的时间差对象,比如输出里的22624 days 11:35:15.057887,直接转int会被Python拒绝,因为它不知道该怎么把天时分秒的复合信息转成单一整数。
正确的解决方法
方法1:提取天数后计算年龄(最直观)
先通过.dt.days提取时间差中的纯天数,再用整数除法//计算完整的年份(避免小数,符合实际年龄的计算逻辑),最后转成int:
import pandas as pd import datetime as DT now = pd.Timestamp(DT.datetime.now()) # 提取天数 → 计算完整年份 → 转int clients["age"] = ((now - clients["date_of_birth"]).dt.days // 365).astype(int)
比如你输出里的22624 days,22624//365 = 61,就是正确的年龄。
方法2:处理缺失值(如果有NaT)
如果你的date_of_birth列有缺失值(输出里的NaT),可以用fillna填充默认值,或者用dropna删除对应行:
# 填充缺失值为0,再转int clients["age"] = ((now - clients["date_of_birth"]).dt.days // 365).fillna(0).astype(int) # 或者直接删除有缺失值的行 clients = clients.dropna(subset=["date_of_birth"]) clients["age"] = ((now - clients["date_of_birth"]).dt.days // 365).astype(int)
方法3:用dt.total_seconds()换算(备选)
如果你想更精确地计算(比如包含部分年份的小数),可以把时间差转成总秒数,再换算成年份:
clients["age"] = ((now - clients["date_of_birth"]).dt.total_seconds() / (365*24*3600)).astype(int)
不过这种方法和方法1的结果几乎一致,方法1更简洁。
验证效果
修正后,你的age列会变成纯整数,比如:
0 0 1 61 2 50 3 40 4 59 ...
内容的提问来源于stack exchange,提问作者andrecdazevedo
相关产品推荐
相关产品推荐

