@san_m_m

Работа с датами в pandas?

Добрый день!

Вопрос следующий...
Есть DataFrame, в котором есть столбцы с датами

spisok = ['25.05..2001',  '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']
df = pd.DataFrame(spisok)


Мне на ум приходит только в лоб

df = df.str.replace("..",' .')

Но он меняет все криво.
Как исправить даты? И почему в лоб не получается поменять?
  • Вопрос задан
  • 141 просмотр
Решения вопроса 2
@dmshar
Если вам уж очень кортит сделать скрипт исправление конкретной ошибки - то можете использовать один из вариантов:
df['С'] = [s.replace('..','.') for s in df['A']]
либо:
def func(x):
    return x.replace('..','.')
df['B']=df['A'].apply(func)


Результат:


/
        A           B           С
0  25.05..2001  25.05.2001  25.05.2001
1   25.06.2001  25.06.2001  25.06.2001
2   25.43.2004  25.43.2004  25.43.2004
3   05.02.2005  05.02.2005  05.02.2005
4   27.02.2008  27.02.2008  27.02.2008
Ответ написан
Комментировать
@kamenyuga
Дело тут не в пандасе, а в самих данных, они кривые. Универсального решения парсинга дат, наверное, не существует. Можно начать с пары автоматических вариантов, а потом руками или кастомными обработчиками.

1. Сообщения об ошибках позволят разделить проблемы на группы.
from dateutil import parser

spisok = ['25.05..2001',  '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']

for elem in spisok:
    try:
        d = parser.parse(elem, dayfirst=True)
        print(f"{elem} -> {repr(d)}")
    except parser.ParserError as err:
        print(f"{elem} -> {err.__class__.__name__}: {err}")

25.05..2001 -> ParserError: Unknown string format: 25.05..2001
25.06.2001 -> datetime.datetime(2001, 6, 25, 0, 0)
25.43.2004 -> ParserError: month must be in 1..12: 25.43.2004
05.02.2005 -> datetime.datetime(2005, 2, 5, 0, 0)
27.02.2008 -> datetime.datetime(2008, 2, 27, 0, 0)

2. Более продвинутая версия парсера. В его настройках не разбирался.
import dateparser

spisok = ['25.05..2001',  '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']

for elem in spisok:
    d = dateparser.parse(elem, languages=['ru'])
    print(f"{elem} -> {repr(d)}")

25.05..2001 -> datetime.datetime(2001, 5, 25, 0, 0)
25.06.2001 -> datetime.datetime(2001, 6, 25, 0, 0)
25.43.2004 -> None
05.02.2005 -> datetime.datetime(2005, 2, 5, 0, 0)
27.02.2008 -> datetime.datetime(2008, 2, 27, 0, 0)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
df.str.replace("..",' .')
за такое больно бьют

кури
pd.to_datetime

ну или to_date если есть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы