首页 > 解决方案 > 如何有条件地从熊猫数据框中的多个日期时间列中选择第一个非空日期?

问题描述

我有一个带有多个日期时间列的熊猫数据框。我想创建一个新列,分别选择第一列、第二列或第三列中不为空的日期。如果这 3 列都没有日期,则设置为今天。

我的数据库的一个例子是:

           date1      date2  date3
0            NaT 2019-01-26    NaT
1     2021-04-13 2021-02-27    NaT
2            NaT        NaT    NaT
3            NaT        NaT    NaT
4            NaT        NaT    NaT

我想创建一个新列,日期 4,第一个日期不是从日期 1 到日期 3 的 NaT。我期望的结果是:

           date1      date2      date3         date4
0            NaT 2019-01-26        NaT    2019-01-26 # (date 2)
1     2021-04-13 2021-02-27        NaT    2021-04-13 # (date 1)
2            NaT        NaT        NaT    2021-06-04 # (today )
3            NaT        NaT        NaT    2021-06-04 # (today )
4            NaT        NaT 2021-02-20    2021-02-20 # (date 3)

我试过这条线:

df["date4"] = df.loc[(df["date1"]) | (df["date2"]) | (df["date3"]) | pd.to_datetime("today")]

但它引发了错误TypeError: unsupported operand type(s) for |: 'DatetimeArray' and 'DatetimeArray'

标签: pythonpandasdataframe

解决方案


想法是回填所选列的缺失值,然后按位置选择第一列并按以下方式替换缺失值today

df['date4'] = (df[['date1','date2','date3']].bfill(axis=1)
                                            .iloc[:, 0]
                                            .fillna(pd.to_datetime("today").normalize()))
print (df)
       date1      date2 date3      date4
0        NaT 2019-01-26   NaT 2019-01-26
1 2021-04-13 2021-02-27   NaT 2021-04-13
2        NaT        NaT   NaT 2021-06-04
3        NaT        NaT   NaT 2021-06-04
4        NaT        NaT   NaT 2021-06-04

推荐阅读