Найти максимальную дату в диапазоне дат без фильтрации в Python - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть файл с одной строкой на EMID на дату вступления в силу.Мне нужно найти максимальную дату вступления в силу для EMID, которая произошла до определенной даты.Например, если EMID = 1 имеет 4 строки, одну для 1/1/16, одну для 10/1/16, одну для 12/1/16 и одну для 12/2/17, и я выбираю дату 1/ 1/17 как моя конкретная дата, я бы хотел знать, что 01.12.16 является максимальной датой для EMID = 1, которая произошла до 01.01.17.

Я знаю, как найти максимальную дату в целом по EMID (groupby.max ()).Я также могу отфильтровать файл по датам до 01.01.17 и найти максимум оставшихся строк.Однако, в конечном счете, мне нужна последняя строка до 01.01.17, а затем все строки после 1/1/17, поэтому фильтрация строк после даты не оптимальна, потому что тогда мне приходится делать сложные объединениячтобы вернуть их обратно.

# Create dummy data
dummy = pd.DataFrame(columns=['EmID', 'EffectiveDate'])
dummy['EmID'] = [random.randint(1, 10000) for x in range(49999)]
dummy['EffectiveDate'] = [np.random.choice(pd.date_range(datetime.datetime(2016,1,1), datetime.datetime(2018,1,3))) for i in range(49999)]

#Create group by 
g = dummy.groupby('EmID')['EffectiveDate']
# This doesn't work, but effectively shows what I'm trying to do
dummy['max_prestart'] = max(dt for dt in g if dt < datetime(2017,1,1))

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

1 Ответ

0 голосов
/ 24 декабря 2018

Использование map после выбора.

s=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.max()
dummy['new']=dummy.EmID.map(s)

Здесь, используя transform и предполагая else dt

dummy['new']=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.transform('max')
dummy['new']=dummy['new'].fillna(dummy.EffectiveDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...