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

Приведенный ниже код работает, но есть ли лучший способ проделать ту же процедуру?

#pd.set_option('display.max_rows', 1000)
import pandas as pd
from datetime import date, timedelta
last_y_days = pd.datetime.today() - timedelta(days=60)
tmp_df = df[['ID','TIMESTAMP']].drop_duplicates()
tmp_df['result'] = tmp_df['TIMESTAMP'] < last_y_days
foobar = tmp_df.groupby('ID')['result'].unique().reset_index()
foobar[foobar['result'].apply(lambda x: True not in x)]

Если мы предположим, что это данные, мне нужны те идентификаторы, у которых нет отметок времени до последних 60 дней. В этом случае единственный ответ: 1

    ID  TIMESTAMP
1   1   2020-08-26
3   2   2020-04-18
4   2   2020-03-31
7   2   2020-01-10
10  2   2020-05-13
14  2   2020-02-24
16  2   2020-02-20
19  2   2020-08-03
34  3   2020-09-29
54  3   2020-08-14
55  3   2020-10-01
70  4   2020-01-25
72  4   2020-04-22
73  4   2020-09-01
75  4   2020-03-03
76  4   2020-07-21
79  4   2020-04-20
81  4   2020-04-28
83  4   2020-08-22
85  4   2020-06-03
1
tandem 12 Окт 2020 в 14:57

1 ответ

Лучший ответ

Используйте numpy.setdiff1d с фильтром {{X1} } в DataFrame.loc :

df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])

from datetime import date, timedelta
last_y_days = pd.datetime.today() - timedelta(days=60)
print (last_y_days)

ids = np.setdiff1d(df['ID'], df.loc[df['TIMESTAMP'] < last_y_days, 'ID'].unique()).tolist()
print (ids)
[1, 3]
    

Или проверьте, есть ли хотя бы один True на группу с помощью GroupBy.any для маски, а затем отфильтровать несоответствующие значения индекса:

m = (df['TIMESTAMP'] < last_y_days).groupby(df['ID']).any()

ids = m.index[~m].tolist()
print (ids)
[1, 3]
3
jezrael 12 Окт 2020 в 12:28