Python中如何使用np.where按条件从两列日期选取值生成新列
问题根因
你的代码存在两个核心错误,导致输出不符合预期:
- 逻辑判断写反:需求是优先取
date_2的值,date_2为空时才取date_1,但你写的判断条件是检查date_1是否等于NaT,判断对象、分支逻辑完全颠倒。 - 空值判断方式错误:
pd.NaT这类空值不能用==做相等判断,任何值(包括NaT本身)和NaT做==比较都会返回False,所以你写的判断条件永远不会触发你想要的分支。
正确实现方案
方案1:使用fillna(最推荐)
这个需求本质是用date_1的值填充date_2的空值,用pandas原生的fillna实现最简洁,且不会出现日期类型转换异常:
df["date_3"] = df["date_2"].fillna(df["date_1"])
运行后得到的date_3列取值完全符合要求:
- 第1、3行
date_2非空,保留date_2的日期值 - 第2、4行
date_2为NaT,自动填充对应行date_1的日期值
方案2:修正np.where写法
如果一定要用np.where实现,需要用isna()方法判断空值,同时调整判断对象和分支顺序:
import numpy as np df["date_3"] = np.where(df["date_2"].isna(), df["date_1"], df["date_2"])
注意:
np.where处理pandas日期列时,偶尔会把datetime类型转成整数或对象类型,如果遇到输出格式异常,优先换用方案1即可。
方案3:使用combine_first
pandas的combine_first方法专门用于按优先级补全列空值,效果和fillna完全一致:
df["date_3"] = df["date_2"].combine_first(df["date_1"])
内容的提问来源于stack exchange,提问作者Gerald Vasquez Aleman
相关产品推荐
相关产品推荐

