Python не может сравнивать даты в датах [дубликаты]

1

У меня есть dataframe df ['Latest date'], как показано ниже

45      01.12.2015 - 13:35:23
46      01.12.2015 - 13:36:27
                ...          
4355    09.07.2018 - 07:54:22
4356    09.07.2018 - 07:52:03
4357    24.07.2018 - 16:00:36
4358    09.07.2018 - 07:53:19
4359    09.07.2018 - 11:40:22
4369    23.07.2018 - 09:13:34
4370    16.07.2018 - 13:02:28
4371    23.07.2018 - 09:14:13
4372    23.07.2018 - 09:14:44
4374    23.07.2018 - 09:15:35
4378    23.07.2018 - 09:15:58
4379    23.07.2018 - 09:16:24
4380    23.07.2018 - 09:16:41
4381    23.07.2018 - 09:17:16
4383    23.07.2018 - 09:17:53
4387    23.07.2018 - 09:18:28
4389    23.07.2018 - 09:19:25
4393    23.07.2018 - 09:20:08
4394    25.07.2018 - 14:25:20
4395    18.07.2018 - 10:10:58
4396    18.07.2018 - 10:10:18
4398    18.07.2018 - 10:10:42
4399    16.07.2018 - 11:09:21
4400    16.07.2018 - 11:27:23
4401    23.07.2018 - 09:21:16
4407    18.07.2018 - 10:11:15
4417    24.07.2018 - 11:56:14
4418    25.07.2018 - 11:05:11

Я хочу фильтровать строки с датой> 22/07/2018

Я попробовал df=df[(df["Latest date"]>"22/07/2018")]

однако новый df возвращает записи не обязательно после 22/07/2018. Интересно, не понимают ли даты в форматах "dd/mm/yy".

  • 1
    Вам нужно использовать объект date , а не строку. Прямо сейчас вы выполняете порядковые сравнения, так что это означает, что 23/06/1984 видится больше.
Теги:
pandas
datetime

1 ответ

2
Лучший ответ

Вам нужны первый разбора дата в datetimes по to_datetime с параметром format, см также http://strftime.org/, если иное форматирование:

df["Latest date"] = pd.to_datetime(df["Latest date"], format='%d.%m.%Y - %H:%M:%S')
#slowier solution without defined format
#df["Latest date"] = pd.to_datetime(df["Latest date"])

print (df["Latest date"].dtype)
datetime64[ns]

[30000 rows x 1 columns]
df = pd.concat([df] * 1000, ignore_index=True)

In [204]: %timeit df["Latest date1"] = pd.to_datetime(df["Latest date"], format='%d.%m.%Y - %H:%M:%S')
163 ms ± 3.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [205]: %timeit df["Latest date2"] = pd.to_datetime(df["Latest date"])
5.09 s ± 55.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Так что теперь возможна фильтрация:

df=df[(df["Latest date"]>"22/07/2018")]
print (df)
             Latest date
4357 2018-07-24 16:00:36
4369 2018-07-23 09:13:34
4371 2018-07-23 09:14:13
4372 2018-07-23 09:14:44
4374 2018-07-23 09:15:35
4378 2018-07-23 09:15:58
4379 2018-07-23 09:16:24
4380 2018-07-23 09:16:41
4381 2018-07-23 09:17:16
4383 2018-07-23 09:17:53
4387 2018-07-23 09:18:28
4389 2018-07-23 09:19:25
4393 2018-07-23 09:20:08
4394 2018-07-25 14:25:20
4401 2018-07-23 09:21:16
4417 2018-07-24 11:56:14
4418 2018-07-25 11:05:11

РЕДАКТИРОВАТЬ:

Другое возможное решение, если входные данные в csv - использовать параметр parse_dates по положению столбца или по имени столбца:

df = pd.read_csv(file, parse_dates=['Latest date']) 
#e.g. third column, pandas counts from 0
#df = pd.read_csv(file, parse_dates=[2]) 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню