предотвращение создания метки времени в форматировании to_datetime() для группировки по периодам

#python #regex #pandas #datetime

Вопрос:

Мои панды df3 очень большие и примерно так выглядят:

 df3 = pd.DataFrame([['23.02.2012', '23.02.2012', 'aaa'], ['27.02.2014', '27.02.2014', 'bbb'], ['17.08.2018', '17.08.2018', 'ccc'], ['22.07.2019', '22.07.2019', 'ddd']], columns=['date', 'period', 'text'])
 

Я хочу, чтобы в столбце period отображались следующие периоды, если даты соответствуют

 df3['date'] = pd.to_datetime(df3['date'], errors = 'coerce')
df3['period'] = df3['date']
col_name = 'period'
strt_col = df3.pop(col_name)
df3.insert(5, col_name, strt_col)

mask1 = (df3['date'] >= '1990-10-14') amp; (df3['date'] < '1994-11-10')
mask2 = (df3['date'] >= '1994-11-10') amp; (df3['date'] < '1999-10-1')
mask3 = (df3['date'] >= '1999-10-1') amp; (df3['date'] < '2004-6-13')
mask4 = (df3['date'] >= '2004-6-13') amp; (df3['date'] < '2009-8-30')
mask5 = (df3['date'] >= '2009-8-30') amp; (df3['date'] < '2014-10-14')
mask6 = (df3['date'] >= '2014-10-14') amp; (df3['date'] < '2019-11-26')
mask7 = (df3['date'] >= '2019-11-26') amp; (df3['date'] < '2021-9-20')
df3.loc[mask1, 'period'] = '1990-1994'
df3.loc[mask2, 'period'] = '1994-1999'
df3.loc[mask3, 'period'] = '1999-2004'
df3.loc[mask4, 'period'] = '2004-2009'
df3.loc[mask5, 'period'] = '2009-2014'
df3.loc[mask6, 'period'] = '2014-2019'
df3.loc[mask7, 'period'] = '2019-2021'

df3 = df3.sort_values(by = ['period'])
.
.
.
 

бросает в df3 = df3.sort_values(by = ['period'])

TypeError: '<' not supported between instances of 'str' and 'Timestamp'

Если я буду запускать код до df3.loc[mask7, 'period'] = '2019-2021' тех пор, пока результат не будет выглядеть следующим образом:

col «период» имеет 1994-1999 , а «дата» имеет чистый 10/2/1998

Пока все хорошо для 99,9 % строк.

Проблема: Ровно в 100 строках есть столбец «период» 10/2/2021 12:00:00 AM , а столбец «дата» имеет чистый 10/2/2021

Желаемый результат за «период»: 2019-2021

Несмотря на то, что значение «дата» чистое и в правильном формате (я дважды проверил, что в этой ячейке нет других символов), впоследствии оно форматируется не так, как все остальные строки. Почему?

Вот все date ячейки (день/месяц/год), которые были источником ложного форматирования:

 'date' after to_datetime()
10/2/2021
10/2/2021
10/2/2021
10/2/2021
10/3/2021
10/3/2021
10/3/2021
10/3/2021
10/3/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/6/2021
10/6/2021
11/1/2021
11/1/2021
11/1/2021
11/1/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/2/2021
12/2/2021
12/2/2021
12/3/2021
12/3/2021
12/4/2021
12/4/2021
12/5/2021
12/5/2021

'period'    
10/2/2021 0:00
10/2/2021 0:00
10/2/2021 0:00
10/2/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/6/2021 0:00
10/6/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/2/2021 0:00
12/2/2021 0:00
12/2/2021 0:00
12/3/2021 0:00
12/3/2021 0:00
12/4/2021 0:00
12/4/2021 0:00
12/5/2021 0:00
12/5/2021 0:00
 

Я добавил df3['question_date'].dt.date после pd.to_datetime этого, что привело к следующей ошибке:

 TypeError: '>=' not supported between instances of 'datetime.date' and 'str'
 

Ответ №1:

Как насчет разделения на n первый элемент и использования его ? Это позволит «очистить» данные.

Что-то вроде приведенного ниже:

 val1 = '27.02.2014nwer'
val2 = '27.02.2014'

date1 = val1.split('n')[0]
date2 = val2.split('n')[0]
print(date1)
print(date2)
 

выход

 27.02.2014
27.02.2014
 

Комментарии:

1. при df3 = df3.sort_values(by = ['period']) бросках ошибка: TypeError: '<' not supported between instances of 'str' and 'Timestamp'

2. что, если там нет новой строки, может быть, просто несколько символов?

3. OP — пожалуйста, поделитесь более «грязным» примером дат, чтобы мы могли расширить решение.

4. вот в чем проблема, как я уже указывал в комментариях к ответу г-на Фуппса. Я хотел бы, но не могу найти никаких отклонений. Я определил грязные date строки и удалил их все вместе. Я добавил то, что пытался, к вопросу выше.