【问题标题】:Find second most recent date in pandas data frame在熊猫数据框中查找第二个最近的日期
【发布时间】:2019-02-26 18:34:18
【问题描述】:

我有数据例如:

  1. 采样日期
  2. 2017 年 8 月 29 日
  3. 2017 年 8 月 29 日
  4. 2017 年 8 月 29 日
  5. 2016 年 2 月 28 日
  6. 2016 年 2 月 28 日
  7. 2014 年 5 月 15 日

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

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

但是如何找到第二个最近的日期。 即 Python 的 pandas 数据框中的 2/28/2016。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先确保您的日期在日期时间中:

    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')
    

    【讨论】:

      【解决方案2】:

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

      假设您不只是想要整个数据框的第二个最近日期或第二个最早日期,而是有一个包含用户和日期的数据框,并且您希望获得每个用户的第二个最早日期(例如他们的第二次交易)。

      示例数据框:

      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]
      

      【讨论】:

        【解决方案3】:

        你也可以使用.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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-30
          • 2021-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多