Найти вторую самую последнюю дату во фрейме данных панд - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть данные, например:

  1. Sampled_Date
  2. 8/29/2017
  3. 8/29/2017
  4. 8/29/ 2017
  5. 2/28/2016
  6. 2/28/2016
  7. 5/15/2014

И т.д. .. Теперь я могунайти максимальные и минимальные даты как

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

Но как найти вторую самую последнюю дату.то есть 28.02.2016 в панде данных Python.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Вы также можете использовать .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
0 голосов
/ 08 августа 2019

Я знаю, что это расширение вопроса, но это то, что мне часто нужно, а иногда и забывают, поэтому я делюсь здесь:

Скажем, вместо того, чтобы просто хотеть второе самое последнее или второе самое раннее свиданиедля всего фрейма данных у вас есть фрейм данных о пользователях и датах, и вы хотите получить вторую самую раннюю дату для каждого пользователя (например, его вторую транзакцию).

Пример кадра данных:

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]
0 голосов
/ 22 сентября 2018

Сначала убедитесь, что даты указаны в 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...