Pandas含NaT值的日期差计算问题:判断ExitDate为NaT时替换为当前日期
解决DataFrame中NaT判断错误并计算任期(Tenure)
问题根源
np.isnat()仅支持numpy原生的datetime64/timedelta64类型,而pandas的日期列实际是Timestamp类型,直接用它判断NaT会触发错误。- 原函数逻辑存在漏洞:即使检测到NaT并定义了当前日期变量,返回时仍使用原
row.ExitDate,未完成替换。
修正后的逐行处理方案
import pandas as pd def calculateTenure(row): # 用pandas原生方法判断NaT if pd.isna(row.ExitDate): exit_date = pd.Timestamp.now() else: exit_date = row.ExitDate return exit_date.year - row.StartDate.year df['Tenure'] = df.apply(calculateTenure, axis=1)
更高效的向量化方案(推荐)
逐行apply效率较低,大数据量下优先用向量化操作:
import pandas as pd # 将ExitDate中的NaT替换为当前时间 exit_dates = df['ExitDate'].fillna(pd.Timestamp.now()) # 计算年份差作为Tenure df['Tenure'] = exit_dates.dt.year - df['StartDate'].dt.year
扩展:计算更精确的任期
如果需要按天/月计算任期,可补充以下代码:
# 计算天数任期 df['Tenure_Days'] = (exit_dates - df['StartDate']).dt.days # 计算近似月份任期 df['Tenure_Months'] = (exit_dates.dt.year - df['StartDate'].dt.year)*12 + (exit_dates.dt.month - df['StartDate'].dt.month)
内容的提问来源于stack exchange,提问作者Vinita
相关产品推荐
相关产品推荐

