Убедитесь, что любой из трех столбцов находится в диапазоне дат столбца - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть DataFrame, содержащий три столбца даты и времени:


tp.loc[:, ['Arrival1', 'Arrival2', 'Departure']].head()

        Arrival1            Arrival2           Departure
0 2018-11-26 05:45:00 2018-11-26 12:00:00 2018-1-26 08:00:00
1 2018-11-26 22:00:00 2018-11-27 00:00:00 2018-11-26 23:00:00
2 2018-11-26 05:45:00 2018-11-26 08:15:00 2018-11-26 06:45:00
3 2018-11-26 07:30:00 2018-11-26 10:15:00 2018-11-26 08:30:00
4 2018-12-02 07:30:00 2018-12-02 21:30:00 2018-12-02 08:00:00

Я хочу получить только те строки tp, чьи прибытия 1, прибытия 2 или отправления (любые из трех) находятся в пределахследующие диапазоны столбцов (любые строки):

db.loc[db['country'] == 'AT']

country        banStartDate          banEndDate
102      AT 2018-12-01 14:00:00 2018-12-01 22:59:00
161      AT 2018-12-01 23:00:00 2018-12-02 21:00:00
51       AT 2018-12-07 23:00:00 2018-12-08 22:59:00

В этом примере я хочу, чтобы из tp была получена только строка № 4, поскольку Arrival2 находится в диапазоне дат в db.

Есть ли простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

После прочтения в ваших фреймах данных с pd.read_csv(), вы можете использовать pd.concat() с логической маской и пониманием списка, после чего следует drop_duplicates():

from io import StringIO
import pandas as pd

df1 = StringIO('''
            Arrival1            Arrival2           Departure
0  2018-11-26 05:45:00  2018-11-26 12:00:00  2018-1-26 08:00:00
1  2018-11-26 22:00:00  2018-11-27 00:00:00  2018-11-26 23:00:00
2  2018-11-26 05:45:00  2018-11-26 08:15:00  2018-11-26 06:45:00
3  2018-11-26 07:30:00  2018-11-26 10:15:00  2018-11-26 08:30:00
4  2018-12-02 07:30:00  2018-12-02 21:30:00  2018-12-02 08:00:00
''')

df2 = StringIO('''
    country        banStartDate          banEndDate
102      AT  2018-12-01 14:00:00  2018-12-01 22:59:00
161      AT  2018-12-01 23:00:00  2018-12-02 21:00:00
51       AT  2018-12-07 23:00:00  2018-12-08 22:59:00
''')

tp = pd.read_csv(df1, sep=r'\s{2,}', engine='python', parse_dates=[0,1,2])
db = pd.read_csv(df2, sep=r'\s{2,}', engine='python', parse_dates=[1,2]).reset_index()

pd.concat([tp.loc[((tp>db.loc[i,'banStartDate']) & (tp<db.loc[i,'banEndDate'])).any(axis=1)] for i in range(db.shape[0])]).drop_duplicates()

Возвращает:

             Arrival1            Arrival2           Departure
4 2018-12-02 07:30:00 2018-12-02 21:30:00 2018-12-02 08:00:00
0 голосов
/ 29 ноября 2018

Вы можете использовать pandas.DataFrame.any с axis = 'row' (или 1), чтобы найти даты между началом и концом.Вам понадобится 3 из них или цикл for для любого количества столбцов «страна» в db.

Кроме того, я полагаю (я могу ошибаться), вам нужно будет преобразовать эти строки в pythondatetime переменные.Код будет выглядеть примерно так:

tp[(datetime.strptime(Start_Date, '%Y-%d-%m %H:%M:%S')> tp >datetime.strptime(End_Date, '%Y-%d-%m %H:%M:%S')).any(axis=1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...