2016-07-17 4 views
3

Будучи новичком с pandas, мне интересно, как я могу выбрать ближайший дате раньше? Например. У меня есть dataframe следующим образом:Pandas выбрать ближайшую дату в прошлом

   Terminart      Info  Datum Ergebnis 
0  Hauptversammlung       NaN 22.06.16  NaN 
1  Jahresabschluss      2015 10.03.16  NaN 
2   Quartalszahlen      Q3 2015 28.10.15  NaN 
3   Quartalszahlen      Q2 2015 29.07.15  NaN 
4  Hauptversammlung       NaN 05.05.15  NaN 
5   Quartalszahlen      Q1 2015 29.04.15  NaN 
6 Bilanzpressekonferenz      2014 12.03.15  NaN 
7 Bilanzpressekonferenz Jahrespressekonferenz 2015 12.03.15  NaN 


можно выбрать Terminart с df.loc(), то есть:

df.loc[df['Terminart'] == 'Hauptversammlung'] 

выбирает только два ряда (который является правильным).


Однако, как я могу выбрать ближайшую дату в прошлом? Это будет первый ряд ( 06/22/16) здесь? По умолчанию блок данных не упорядочен.

ответ

4

Вы можете конвертировать to_datetime столбец Datum, а затем первый фильтр ниже, так как нет никакой разницы (timedelta = 0), а затем найти индекс значения максимального по idxmax:

Примечание: В образце изменяется последний DateTime для лучшего тестирования

import pandas as pd 
import datetime as dt 

print (df) 
            Terminart  Info  Datum Ergebnis 
0        Hauptversammlung  NaN 22.06.16  NaN 
1        Jahresabschluss  2015 10.03.16  NaN 
2        Quartalszahlen Q3 2015 28.10.15  NaN 
3        Quartalszahlen Q2 2015 29.07.15  NaN 
4        Hauptversammlung  NaN 05.05.15  NaN 
5        Quartalszahlen Q1 2015 29.04.15  NaN 
6      Bilanzpressekonferenz  2014 12.03.15  NaN 
7 Bilanzpressekonferenz Jahrespressekonferenz  2015 19.07.16  NaN 
df['Datum'] = pd.to_datetime(df.Datum, format='%d.%m.%y') 

date = dt.datetime.now().date() 
print (date) 
2016-07-17 

diff = (df.Datum - date) 
print (diff) 
0 -25 days 
1 -129 days 
2 -263 days 
3 -354 days 
4 -439 days 
5 -445 days 
6 -493 days 
7  2 days 
Name: Datum, dtype: timedelta64[ns] 

indexmax = (diff[(diff < pd.to_timedelta(0))].idxmax()) 

print (df.ix[[indexmax]]) 
      Terminart Info  Datum Ergebnis 
0 Hauptversammlung NaN 2016-06-22  NaN 
+0

Это работает как шарм, спасибо большое! – Jan

+0

К сожалению, для последующей реализации: реализация вашего кода, как я могу ограничить найденные даты значением в 'Terminart', скажем, я только хочу искать даты с' 'Teminart' == 'Quartalszahlen'' - can это будет сделано? – Jan

+0

дайте мне второй – jezrael

0

Сначала вы преобразовать столбец 'нулевой точки' в поле даты с to_datetime() то вы можете просто сортировать dataframe по дате с sort_values() и затем распечатать в первом ряду:

df['Datum'] = pd.to_datetime(df['Datum'], format='%d.%m.%y') 
df.sort_values('Datum') 
print(df.iloc[0]) 
+0

В то время как это работает - сортировка будет дороже, чем просто найти максимум, как показано в ответе Джезраэля ... –

+0

А также есть проблема, что вам нужно найти максимальную дату в 'прошлом', поэтому, если в будущем есть данные, ваш решение не выполнено. – jezrael

+0

Я использовал @jezrael ответ (причина прошлых значений), спасибо за ваши усилия! – Jan

Смежные вопросы