如何基于多列datetime值生成记录最新日期列名的新列?
问题:基于多列日期时间值生成对应列名的新列
我需要基于first_test、second_test、third_test这三列日期时间数据,创建一个新列max_test,每行取这三列里最新的日期(最大值)对应的列名填进去。
现有数据
emp_id first_test second_test third_test a123 2023-01-19 12:31:00-06:00 2023-02-09 12:31:00-06:00 a321 2023-02-09 11:43:00-04:30 a543 a211 2023-02-18 11:43:00-04:30 a134 2023-04-23 16:33:00-03:40 2023-01-09 11:43:00-04:30
预期输出
emp_id first_test second_test third_test max_test a123 2023-01-19 12:31:00-06:00 2023-02-09 12:31:00-06:00 third_test a321 2023-02-09 11:43:00-04:30 second_test a543 a211 2023-02-18 11:43:00-04:30 first_test a134 2023-04-23 16:33:00-03:40 2023-01-09 11:43:00-04:30 first_test
我尝试用for循环实现,但处理空值时总是出错,目前写的代码片段如下:
for i in range(len(test)): first_date = test['first_test'][i] second_test_date = test['second_test'][i] third_test = test['third_test'][i] if second_test > third_test:
请问有没有可行的实现方法?
解决方案
用Pandas内置的idxmax方法可以高效处理这个需求,同时自动跳过空值,不用手动写循环判断:
步骤1:转换日期列类型
首先确保三列是datetime类型,把空值转为NaT(时间类型的空值):
import pandas as pd # 将目标列转换为带时区的datetime类型,无法转换的空值转为NaT test[['first_test', 'second_test', 'third_test']] = test[['first_test', 'second_test', 'third_test']].apply( pd.to_datetime, errors='coerce', utc=True )
步骤2:生成max_test列
使用idxmax(axis=1)按行找出最大值对应的列名,skipna=True自动忽略空值:
# 按行取最大值对应的列名,全空的行返回NaN test['max_test'] = test[['first_test', 'second_test', 'third_test']].idxmax(axis=1, skipna=True)
说明
pd.to_datetime的errors='coerce'参数会把无效的日期值(比如空字符串)转为NaT,避免后续比较出错;utc=True统一时区,确保跨时区的日期能正确比较。idxmax(axis=1)会遍历每行的三个日期列,找出值最大的那个列的名称,空值会被自动跳过。如果某一行所有列都是空值,max_test会显示NaN,和预期输出一致。
内容的提问来源于stack exchange,提问作者Vivo
相关产品推荐
相关产品推荐

