代码之家  ›  专栏  ›  技术社区  ›  MD Rijwan

在数据框中查找第二个最近的日期

  •  1
  • MD Rijwan  · 技术社区  · 7 年前

    1. 抽样检查日期
    2. 8/29/2017
    3. 8/29/2017
    4. 2/28/2016
    5. 2/28/2016

    等。。 现在我可以找到最大和最小日期作为

    df.Sampled_Date.max()
    df.Sampled_Date.min()
    

    但是如何找到第二个最近的约会。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Deena    7 年前

    你也可以使用 .argsort()

    import pandas as pd
    
    # Generate dates
    dates = pd.Series(pd.date_range(start='1/1/2017', periods=5, freq=pd.offsets.MonthEnd(3)))
    
    # Random order
    dates = dates.sample(frac=1, random_state=0)
    
    # Get the second 'max' date
    dates[dates.argsort() == (len(dates)-2)] # 3   2017-10-31
    
        2
  •  3
  •   sacuL    7 年前

    首先确保您的日期在datetime中:

    df['Sampled_Date'] = pd.to_datetime(df['Sampled_Date'])
    

    nlargest(2) ,并取其最后一个值:

    df['Sampled_Date'].drop_duplicates().nlargest(2).iloc[-1]
    
    # Timestamp('2016-02-28 00:00:00')
    
        3
  •  1
  •   Paul Meinshausen    6 年前

    我知道这是问题的延伸,但这是我经常需要的东西,有时会忘记,所以我在这里分享:

    数据帧示例:

    test = pd.DataFrame()
    test['users'] = [1,2,3,2,3,2]
    test['dates'] = pd.to_datetime(['2019-01-01','2019-01-01',
                                    '2019-01-02','2019-01-02',
                                    '2019-01-03','2019-01-04'])
    

    用户2的最早日期为“2019-01-01”,次早日期为“20-19-01-02”。我们可以使用groupby、apply和nlargest/nsmallest:

    test.groupby('users')['dates'].apply(lambda x: x.nsmallest(2).max())
    

    这给了我们这个输出:

    users
    1   2019-01-01
    2   2019-01-02
    3   2019-01-03
    Name: dates, dtype: datetime64[ns]