Python 获取数据帧中每行的最高日期值

Python 获取数据帧中每行的最高日期值,python,pandas,datetime,Python,Pandas,Datetime,通过导入excel工作表,我得到了一个熊猫数据框。这些列主要是日期,但也可以是另一种数据类型,例如id列。现在我想得到每一行的最新日期和相关列名,以便得到一个列表或一系列元组:id+最新日期。我对这一点还很陌生,如果有任何帮助,我将不胜感激。 下面是一些代码示例 import pandas as pd import os def main(): #df=importExcel() #getLastActions(df) df1 = pd.DataFrame({'i

通过导入excel工作表,我得到了一个熊猫数据框。这些列主要是日期,但也可以是另一种数据类型,例如id列。现在我想得到每一行的最新日期和相关列名,以便得到一个列表或一系列元组:id+最新日期。我对这一点还很陌生,如果有任何帮助,我将不胜感激。 下面是一些代码示例

 import pandas as pd   
 import os

 def main():
   #df=importExcel()
   #getLastActions(df)
   df1 = pd.DataFrame({'id':[1,2,3,4], 
                'y':[true,false,true,true],
                'date1':[1996-05-31,2002-01-01,1999-07-17,2019-01-01],
                'date2':[2010-10-11,2000-05-01,1999-12-17,1999-02-02],
                'date3':[1993-09-11,2005-11-11,1997-08-08,2019-04-15] })
    getLastActions(df1)

 def importExcel():
   wk_dir = os.path.dirname(os.path.realpath('__file__'))
   df = pd.read_excel (wk_dir+'/OPS.xlsx')
   return df

 def getLastActions(df):
   columns = list(df)
   for i in columns:
       #.......
 if __name__ == '__main__':
   main()                   
我想得到像这样的东西: 结果=[(12010-10-11)、(22005-11-11)、(31999-12-17)、(42019-04-15)]

也就是说,每行的最大值,但仅限包含日期的列的最大值。
有人知道怎么做吗?

通过
id
列创建索引,通过选择datetimes列,获得每行最大值,将datetimes转换为字符串,并通过
列表将最后一个
系列
转换为元组列表:

df1 = pd.DataFrame({'id':[1,2,3,4], 
            'y':[True,False,True,True],
           'date1':pd.to_datetime(['1996-05-31','2002-01-01','1999-07-17','2019-01-01']),
           'date2':pd.to_datetime(['2010-10-11','2000-05-01','1999-12-17','1999-02-02']),
           'date3':pd.to_datetime(['1993-09-11','2005-11-11','1997-08-08','2019-04-15'])})
print(df1)
   id      y      date1      date2      date3
0   1   True 1996-05-31 2010-10-11 1993-09-11
1   2  False 2002-01-01 2000-05-01 2005-11-11
2   3   True 1999-07-17 1999-12-17 1997-08-08
3   4   True 2019-01-01 1999-02-02 2019-04-15

a = (list(df1.set_index('id')
             .select_dtypes('datetime')
             .max(axis=1)
             .dt.strftime('%Y-%m-%d')
             .items()))
print (a)
[(1, '2010-10-11'), (2, '2005-11-11'), (3, '1999-12-17'), (4, '2019-04-15')]
详细信息

print (df1.set_index('id').select_dtypes('datetime'))
        date1      date2      date3
id                                 
1  1996-05-31 2010-10-11 1993-09-11
2  2002-01-01 2000-05-01 2005-11-11
3  1999-07-17 1999-12-17 1997-08-08
4  2019-01-01 1999-02-02 2019-04-15

print (df1.set_index('id').select_dtypes('datetime').max(axis=1))
id
1   2010-10-11
2   2005-11-11
3   1999-12-17
4   2019-04-15
dtype: datetime64[ns]

print (df1.set_index('id').select_dtypes('datetime').max(axis=1).dt.strftime('%Y-%m-%d'))
id
1    2010-10-11
2    2005-11-11
3    1999-12-17
4    2019-04-15
dtype: object

result=[df1.filter(regex='date').max(1.items()]中的x代表x
..感谢@ChrisA的回复。这给了我一个id和nan的元组列表。如果nan出现在一行中,是否将其视为最高值?不,听起来不对。。。。只有当任何值为
NaN
NaN
时才会导致问题,请尝试
fillna
-
列表(df1.filter(regex='date').fillna('0').max(1).items())
非常感谢您的回复!我正试图修复它,但不知何故,我仍然得到一些错误与您的解决方案。可能是因为我从excel导入,而列数据类型未定义?但是,对于第一个解决方案,我得到了一个错误:TypeError:无法将类型为的对象转换为datetimelike索引。然后它说:AttributeError:只能使用带有datetimelike值的.dt访问器作为我得到的第二个解决方案:AttributeError:“DataFrame”对象没有属性“to_numpy”@毛里求斯-什么是
打印(df.info())
?@毛里求斯-将
.filter(如class='date')
更改为
.filter(regex='date')
,我希望它现在能工作。该死的,我忘了。。如何在元组中包含另一个值。所以我也会有关于最大值来自哪个列的信息?对不起,我希望我不是很烦人。类似(2010年10月11日,日期2)