基于Pandas的DOB列新增Age列时触发TypeError错误的排查
问题解决:DataFrame中计算客户年龄的报错修复及实现
错误原因分析
你遇到的TypeError: Invalid dtype object for __floordiv__报错主要有两个核心原因:
- DOB列数据类型不匹配:原始
DOB列是字符串格式(如31.07.1983),而非datetime类型,无法直接执行时间运算。 - 运算逻辑顺序错误:代码中直接对
users_pd["DOB"]与timedelta做除法是错误的,正确逻辑应为先计算当前日期与DOB的时间差,再用该差值除以年对应的timedelta。
解决方案
步骤1:将DOB列转换为datetime类型
首先需要把字符串格式的日期转为pandas可识别的datetime类型:
import pandas as pd # 转换DOB列,指定日期格式为「日.月.年」 users_pd['DOB'] = pd.to_datetime(users_pd['DOB'], format='%d.%m.%Y')
步骤2:计算客户年龄(两种可选方法)
方法一:精确计算(考虑当年生日是否已过)
这种方法会根据当前日期判断客户当年生日是否已过,得到最准确的年龄:
today = pd.Timestamp.today() # 先计算年份差 users_pd['Age'] = today.year - users_pd['DOB'].dt.year # 筛选出当年生日未过的用户,年龄减1 mask = (today.month < users_pd['DOB'].dt.month) | ((today.month == users_pd['DOB'].dt.month) & (today.day < users_pd['DOB'].dt.day)) users_pd['Age'] -= mask.astype(int)
方法二:近似计算(基于总天数除以平均年天数)
如果不需要严格考虑生日是否已过,可以用时间差除以平均年天数(365.2425,适配闰年):
today = pd.Timestamp.today() users_pd['Age'] = (today - users_pd['DOB']) // pd.Timedelta(days=365.2425)
内容的提问来源于stack exchange,提问作者CeePee
相关产品推荐
相关产品推荐

