python - 如何有条件地从熊猫数据框中的多个日期时间列中选择第一个非空日期?
问题描述
我有一个带有多个日期时间列的熊猫数据框。我想创建一个新列,分别选择第一列、第二列或第三列中不为空的日期。如果这 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'
解决方案
想法是回填所选列的缺失值,然后按位置选择第一列并按以下方式替换缺失值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
推荐阅读
- openebs - OpenEBS 是否支持共享存储?
- java - 如何从 Unity Android 插件调用非静态方法?
- python-3.x - 匹配器 GMS opencv
- apache-kafka - 我们可以使用zookeeper在kafka apache元模型中存储偏移量吗
- javascript - Uncaught (in promise) 执行命令状态被锁定
- c - 比较C中两个字符串的排列
- html - R 代码 + 文本:Rmd 和 R 之间代码块分隔的差异
- sql - SQL Server 查询有子句
- javascript - Highcharts 折线图向下钻取无法正常工作
- typescript - Typescript readonly 修饰符被别名剥离