pandas: проблема с фильтрацией значений даты и времени на основе нескольких столбцов - PullRequest
1 голос
/ 30 марта 2020

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

EventId             StartTime                       EndTime            
18   2013-04-11 16:33:11.735342100   2013-04-11 17:16:47.976164100  
19   2013-04-10 16:33:46.575337300   2013-04-11 18:10:08.428443900  
20   2013-04-10 17:17:04.033083300   2013-04-11 18:10:13.907757900  
21   2013-04-11 00:10:24.293352100   2013-04-11 18:45:17.754240800  
23   2013-04-11 01:11:20.278558900   2013-04-11 18:45:00.435247300  
25   2013-04-15 09:42:22.549026700   2013-04-15 23:54:33.389964300  
26   2013-04-16 07:42:24.588807700   2013-04-16 17:42:41.077751300  
28   2013-04-19 16:51:22.699240800   2013-04-19 18:39:03.167468100  
31   2013-04-19 18:30:56.891621300   2013-04-19 19:42:50.418640200  
17   2013-04-20 16:07:07.327879000   2013-04-20 22:17:17.783053600  

Я хочу получить те события, которые были активны в течение 7 -9 утра, включая 8, и использовали следующий запрос, после извлечения часов в виде отдельного столбца.

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

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

df['StartHr']=df['StartTime'].dt.hour
df['EndHr']=df['EndTime'].dt.hour
df[((df['StartHr']<=7)| (df['StartHr']==8)) & ((df['EndHr']==8)|(df['EndHr']>=9))]

Он работает, как задумано, но с учетом набора данных он не может получить некоторые результаты, например, событие Id 20

            20   2018-05-10 17:17:04.033083300   2018-05-11 18:10:13.907757900  

, так как это событие активно в интервале времени 7-9 следующего дня, но я не могу его получить. То же самое касается id 26 и 21 Любая помощь в решении этой проблемы. Как я могу сравнить значения даты и времени в pandas.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

У меня был go.

df=pd.DataFrame({'EventId':[18,19,20,21], 'startTime':['2013-04-11 07:33:11.735342100','2013-04-10 16:33:46.575337300','2013-04-10 08:17:04.033083300','2013-04-11 00:10:24.293352100'],'EndTime':['2013-04-11 08:16:47.976164100','2013-04-11 18:10:08.428443900','2013-04-11 09:10:13.907757900','2013-04-11 18:45:17.754240800']})

Приведите даты в datetime

df['startTime']=pd.to_datetime(df['startTime'])
df['EndTime']=pd.to_datetime(df['EndTime'])
df.set_index(['startTime'], inplace=True)

Установите для каждого периода времени начало и конец для индексации и извлеките подходящее время, используя .between_time

df['StartHr']=df.index.time
a=df.iloc[:,:1].between_time('07:00:00', '09:00:00')
df.reset_index(inplace=True)
a.reset_index(inplace=True)

df.set_index(['EndTime'], inplace=True)
df['EndHr']=df.index.time
b=df.iloc[:,:-2].between_time('07:00:00', '09:00:00')
b.reset_index(inplace=True)

Объединение двух результатов

df2=pd.merge(a, b, on='EventId')
0 голосов
/ 30 марта 2020

Прежде всего, у вас могут быть более простые условия:

df[((df['StartHr']<=8)) & ((df['EndHr']>=8))]

Я не могу придумать чего-то более простого, чем взять разницу между временем окончания и временем начала и сравнить ее с 79200 с, что соответствует количеству секунд между событием, начавшимся в 9 часов утра и заканчивающимся в 7 часов утра следующего дня, то есть предельной продолжительностью для вашего случая (22 часа).

Мой код выглядит следующим образом:

limit_delta = 79200
test_df['diff'] = (test_df['EndTime'] - test_df['StartTime']).map(lambda td : td.total_seconds())
test_df[(((test_df['StartHr']<=8) & (test_df['EndHr']>=8)) | (test_df['diff'] <= limit_delta))] 

Пожалуйста, дайте мне знать, если это решило вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...