You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中将3列Datetime值合并为单列,生成包含每行最早日期的新列

解决方案:为DataFrame生成每行最早日期的新列

我来帮你搞定这个问题!首先咱们先明确需求:从每行的三个日期列(DATE_BEGIN、DATE_START、DATE_REGISTERED)中筛选出最早的日期,生成新列ACTUAL_START_DATE,同时自动忽略NaN值。

第一步:构造示例DataFrame

先把你的示例数据转换成可复现的pandas DataFrame,顺便把日期列转为datetime格式:

import pandas as pd
import numpy as np

data = {
    'CLIENT_ID': [1, 2, 3, 4],
    'DATE_BEGIN': ['2020-01-01', '2020-01-02', np.nan, '2020-01-01'],
    'DATE_START': ['2020-01-01', '2020-02-01', '2020-05-01', '2020-01-02'],
    'DATE_REGISTERED': ['2020-01-01', '2020-01-01', '2020-04-01', np.nan]
}

df = pd.DataFrame(data)
# 将日期列转为datetime类型
date_columns = ['DATE_BEGIN', 'DATE_START', 'DATE_REGISTERED']
df[date_columns] = df[date_columns].apply(pd.to_datetime)

第二步:生成ACTUAL_START_DATE列

最直接高效的方法是使用pandas的min()方法,指定按行计算(axis=1),并设置skipna=True忽略空值:

df['ACTUAL_START_DATE'] = df[date_columns].min(axis=1, skipna=True)

运行后你会得到完全符合预期的结果:

CLIENT_IDDATE_BEGINDATE_STARTDATE_REGISTEREDACTUAL_START_DATE
12020-01-012020-01-012020-01-012020-01-01
22020-01-022020-02-012020-01-012020-01-01
3NaT2020-05-012020-04-012020-04-01
42020-01-012020-01-02NaT2020-01-01

关于bfill变体的可行性

结论:不能通过bfill的变体实现这个需求

原因很简单:bfill(backward fill)的核心作用是填充缺失值,它会用当前位置后方的非空值来填补NaN,完全不涉及值的大小比较。比如如果我们尝试对日期列按行执行bfill:

df[date_columns].bfill(axis=1)

第三行的DATE_BEGIN会被填充为DATE_START的2020-05-01,但我们需要的是更早的DATE_REGISTERED(2020-04-01),这显然不符合需求。

咱们的需求是聚合每行的非空值并选取最小值,和bfill的填充逻辑完全不匹配,所以min方法才是最适合的解决方案。

内容的提问来源于stack exchange,提问作者Mazil_tov998

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:12:46