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



我有数据,例如:

  1. Sampled_Date
  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()

但是如何找到第二个最近的日期。 即 2016 年 2 月 28 日在 Python 的熊猫数据框中。

确保您的日期首先是日期时间:

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

我知道这是问题的扩展,但这是我经常需要的,有时也会忘记,所以我在这里分享:

假设您有一个用户和日期的数据框,而不是只想要整个数据帧的第二个最近或第二个最早日期,并且您希望为每个用户获取第二个最早日期(例如他们的第二个事务(。

示例数据帧:

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]

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

最新更新