проблема при извлечении подкадра на основе даты - PullRequest
0 голосов
/ 25 октября 2019

У меня есть фрейм данных card_df. Я хотел бы извлечь набор данных поезда на основе столбца «DateTrans».

набор данных поезда должен содержать только те строки, где «DateTrans» находятся между («01/01/2019») и («31/06/2019»')

Я пытался с этим кодом:

# Create the train and test data
X_train, X_test, y_train, y_test = train_test_split(card_df.loc[card_df['DateTrans'].between('01/01/2019','31/06/2019', inclusive=False)].drop(["RapprochementFraude"], axis=1),
                                                    card_df.RapprochementFraude)

Но проблема в том, что набор данных поезда содержит строки, где DateTrans находятся вне интервала, который я уточняю ниже.

X_train['DateTrans']



2044    27/08/2019
959     25/05/2019
1669    27/03/2019
498     28/05/2019
1198    28/05/2019
           ...    
1985    25/07/2019
435     29/01/2019
291     25/07/2019
107     26/06/2019
29      25/07/2019
Name: DateTrans, Length: 30048, dtype: object

Любая идея, пожалуйста, чтобы исправить это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Когда вы передаете pd.Series.between(left, right, inclusive=False) даты в формате str, он возвращает индексы строк из Series, которые больше, чем left строка, и меньше, чем right строка. Для правильного сравнения строк, представляющих даты, вы должны использовать Year-Month-Day нотацию.

Например:

print('31/06/2019' > '25/10/2019') # Day-Month-Year notation
# True   
print('2019/06/31' > '2019/10/25') # Year-Month-Day notation
# False

Вы можете решить свою проблему, изменив нотацию на Год-Месяц-День:

import pandas as pd

card_df = pd.DataFrame(data=pd.Series(pd.date_range(start='20190101', end='20191025')).dt.strftime('%d/%m/%Y'), 
                       columns=['DateTrans'])

print(card_df.head()
#     DateTrans
# 0  01/01/2019
# 1  02/01/2019
# 2  03/01/2019
# 3  04/01/2019
# 4  05/01/2019

cards_subgroup = card_df[card_df['DateTrans'].apply(lambda x: '/'.join(x.split('/')[::-1])).between('2019/01/01','2019/06/31', inclusive=False)]

print(cards_subgroup.head())
#     DateTrans
# 1  02/01/2019
# 2  03/01/2019
# 3  04/01/2019
# 4  05/01/2019
# 5  06/01/2019

print(cards_subgroup.tail())
#       DateTrans
# 176  26/06/2019
# 177  27/06/2019
# 178  28/06/2019
# 179  29/06/2019
# 180  30/06/2019
0 голосов
/ 25 октября 2019

Полагаю, ваш dateTrans является строкой, а не datetime типа.

Попробуйте преобразовать ее следующим образом:

card_df['dateTrans']= pd.to_datetime(card_df['dateTrans'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...