【问题标题】:How to get maximum date value from a group of date columns如何从一组日期列中获取最大日期值
【发布时间】:2019-02-03 05:57:33
【问题描述】:

这是样本数据:

import pandas as pd
d = {'name': ['john', 'tom', 'phill', 'nero', 'bob', 'rob'], 'date1' :['2015-10-05', '2015-01-05', '2015-07-06', '2015-10-06', '2015-10-06', '2015-12-08'], 'date2' :['2015-10-05', '2015-01-05', '2015-07-06', '2015-08-06', '2015-09-06', '2015-12-08'], 'date3' :['2015-07-05', '2015-11-05', '2015-07-06', '2015-11-06', '2015-05-06', '2015-05-08']}
df2 = pd.DataFrame(data = d)
df2['date1'] = pd.DatetimeIndex(df2['date1'])
df2['date2'] = pd.DatetimeIndex(df2['date2'])
df2['date3'] = pd.DatetimeIndex(df2['date3'])

这是桌子

问题 1:我想创建一个新列 max_date,它将具有每行的最大日期值。我以为我可以创建这些列的列表,然后对它们应用 max ,但它没有用。我找到了 numpy.amax(),但无法让它工作。

问题 2:我必须使用列名来指定这些列,不能使用 df2[ , 0:2] 等列的位置索引

更新问题 2 - 当我说“使用列名”时 - 我的意思是我有一个列名列表,我需要像 [date1, date2, 日期3]。抱歉,如果我的帖子不清楚。

【问题讨论】:

    标签: python python-3.x pandas numpy datetime


    【解决方案1】:

    select_dtypes

    这适用于所有日期时间列,无论命名约定如何。

    df2.assign(max_date=df2.select_dtypes('datetime').max(1))
    
           date1      date2      date3   name   max_date
    0 2015-10-05 2015-10-05 2015-07-05   john 2015-10-05
    1 2015-01-05 2015-01-05 2015-11-05    tom 2015-11-05
    2 2015-07-06 2015-07-06 2015-07-06  phill 2015-07-06
    3 2015-10-06 2015-08-06 2015-11-06   nero 2015-11-06
    4 2015-10-06 2015-09-06 2015-05-06    bob 2015-10-06
    5 2015-12-08 2015-12-08 2015-05-08    rob 2015-12-08
    

    【讨论】:

      【解决方案2】:

      您可以通过str.startswith 使用布尔索引:

      date_cols = df2.columns[df2.columns.str.startswith('date')]
      df2['max_date'] = df2[date_cols].max(1)
      
      print(df2)
      
             date1      date2      date3   name   max_date
      0 2015-10-05 2015-10-05 2015-07-05   john 2015-10-05
      1 2015-01-05 2015-01-05 2015-11-05    tom 2015-11-05
      2 2015-07-06 2015-07-06 2015-07-06  phill 2015-07-06
      3 2015-10-06 2015-08-06 2015-11-06   nero 2015-11-06
      4 2015-10-06 2015-09-06 2015-05-06    bob 2015-10-06
      5 2015-12-08 2015-12-08 2015-05-08    rob 2015-12-08
      

      【讨论】:

      • 虽然我一直在寻找可以使用列名列表的答案,但我也许可以使用 .str 方法。会回来提供反馈。
      • 当然,你可以直接说date_cols = ['date1', 'date2', 'date3']
      【解决方案3】:

      使用maxfilter like

      df2['max_date']=df2.filter(like='date',axis=1).max(1)
      df2
      Out[157]: 
             date1      date2      date3   name   max_date
      0 2015-10-05 2015-10-05 2015-07-05   john 2015-10-05
      1 2015-01-05 2015-01-05 2015-11-05    tom 2015-11-05
      2 2015-07-06 2015-07-06 2015-07-06  phill 2015-07-06
      3 2015-10-06 2015-08-06 2015-11-06   nero 2015-11-06
      4 2015-10-06 2015-09-06 2015-05-06    bob 2015-10-06
      5 2015-12-08 2015-12-08 2015-05-08    rob 2015-12-08
      

      【讨论】:

      • 你不需要axis=1
      猜你喜欢
      • 2020-02-05
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多