#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
строки и удалил их все вместе. Я добавил то, что пытался, к вопросу выше.