使用Lambda函数计算DataFrame中日期与今日的年分数及NaT处理
问题解决:计算日期年分数并处理NaT值
错误原因分析
- KeyError: 'YEAR_FRAC':你在Lambda函数中尝试引用了尚未创建的
YEAR_FRAC列,此时该列还不存在于DataFrame中,导致键查找失败。 - AttributeError: 'Series' object has no attribute 'DATE_Col':你对
df['DATE_Col'](Series对象)调用apply,Lambda参数x是单个日期元素而非整行数据,自然没有DATE_Col属性。
正确实现方案
方法1:逐行处理(兼容复杂逻辑)
通过df.apply(axis=1)按行处理,同时判断并跳过NaT值:
import pandas as pd from datetime import datetime # 假设你的DataFrame名为df current_date = datetime.now() df['YEAR_FRAC'] = df.apply( lambda row: (current_date - row['DATE_Col']).days / 365.25 if pd.notna(row['DATE_Col']) else None, axis=1 )
- 用
pd.notna()判断DATE_Col是否为有效日期,NaT值会被设为None(最终转为NaN) - 除以365.25是为了兼顾闰年的平均年天数
方法2:向量化操作(推荐,性能更优)
利用Pandas的日期向量运算,自动处理NaT值:
import pandas as pd from datetime import datetime current_date = datetime.now() # 直接计算日期差,提取天数后除以年天数 df['YEAR_FRAC'] = (current_date - df['DATE_Col']).dt.days / 365.25
- NaT值参与运算后结果会自动转为NaN,无需额外判断
- 向量化操作比逐行
apply快数倍,适合大数据集
NaT值后续处理
如果需要将NaN替换为特定值(比如0),可以用fillna():
df['YEAR_FRAC'] = df['YEAR_FRAC'].fillna(0)
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

