如何基于pandas多列的最小日期创建新列?
解决方法
步骤1:转换日期列为datetime类型
原始数据中的日期以字符串格式存储,首先需要将Event1、Event2、Event3三列转换为pandas的datetime类型,这样才能正确比较日期的先后顺序。使用pd.to_datetime()并设置errors='coerce',可以把无效值(比如原数据中的空值)转为pandas的NaT(时间类型的空值),方便后续处理。
步骤2:按行计算最小日期
调用min(axis=1)方法对每行的三个日期列取最小值,全空的行会自动返回NaT,后续可根据需求转为NaN或保持原格式。
完整代码示例
import pandas as pd # 构造示例数据 data = { 'Event1': ['7/27/2014', '3/5/2016', '5/13/2017', None, None, None], 'Event2': [None, None, '5/10/2013', None, '5/12/2013', None], 'Event3': [None, '2/1/2013', None, '4/28/2014', '3/6/2016', None] } df = pd.DataFrame(data) # 转换为datetime类型 df[['Event1', 'Event2', 'Event3']] = df[['Event1', 'Event2', 'Event3']].apply(pd.to_datetime, errors='coerce') # 生成最小日期列 df['Min_Date'] = df[['Event1', 'Event2', 'Event3']].min(axis=1) # 可选:将NaT转为和原数据一致的空值格式 # df['Min_Date'] = df['Min_Date'].astype('object').where(df['Min_Date'].notna(), None) print(df)
输出结果
Event1 Event2 Event3 Min_Date 0 2014-07-27 NaT NaT 2014-07-27 1 2016-03-05 NaT 2013-02-01 2013-02-01 2 2017-05-13 2013-05-10 NaT 2013-05-10 3 NaT NaT 2014-04-28 2014-04-28 4 NaT 2013-05-12 2016-03-06 2013-05-12 5 NaT NaT NaT NaT
如果需要让Min_Date列的格式和原始数据的日期字符串一致,可添加以下代码将datetime转为指定格式的字符串:
df['Min_Date'] = df['Min_Date'].dt.strftime('%m/%d/%Y').where(df['Min_Date'].notna(), None)
转换后输出:
Event1 Event2 Event3 Min_Date 0 2014-07-27 NaT NaT 07/27/2014 1 2016-03-05 NaT 2013-02-01 02/01/2013 2 2017-05-13 2013-05-10 NaT 05/10/2013 3 NaT NaT 2014-04-28 04/28/2014 4 NaT 2013-05-12 2016-03-06 05/12/2013 5 NaT NaT NaT None
内容的提问来源于stack exchange,提问作者weizer
相关产品推荐
相关产品推荐

