在熊猫数据框中找到倒数第二个日期

时间:2018-09-22 17:31:32

标签: python pandas

例如,我有数据

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

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

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

但是如何查找倒数第二个日期。 即2016年2月28日在Python的pandas数据框中。

3 个答案:

答案 0 :(得分:2)

确保您的日期最早在日期时间:

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

答案 1 :(得分:1)

您也可以使用.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 :(得分:0)

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

让我们说,您不仅希望整个数据框的倒数第二个或第二个最早的日期,还拥有一个用户和日期的数据框,并且希望获得每个用户的第二个最早的日期(例如,他们的第二笔交易)。

示例数据框:

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]