Pandas dataframe разбирает строку столбца для извлечения даты в новый столбец - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть кадр данных, содержащий строковый столбец:

text = ['dasndljaksdhfinwejfiv 12/05/2018'', 'akdhaouiyfbh adv12.03.2019','faytdvi advonalsdnfoaidv 5/9/2019IUAYFNVVKNVAIUEHF']

Я хочу извлечь только даты из этого и добавить в новый столбец.

Я пробовал следующее, но он просто возвращает исходное строковое значение столбца:

df['date'] = df.text.replace({r"\d{2}[\/ ](\d{2}|January|Jan)[\/ ]\d{2,4}"},regex=True)

Какой лучший способ обойти это?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете использовать .str.extract(), использовать \d{1,2} для сопоставления однозначных дней и месяцев и добавить . к шаблону разделителей:

df['date'] = df['text'].str.extract(r"(\d{1,2}[/. ](?:\d{1,2}|January|Jan)[/. ]\d{2}(?:\d{2})?)")

См. regex demo .

Также обратите внимание, что \d{2}(?:\d{2})? соответствует 2 или 4 цифрам, а \d{2,4} соответствует 2, 3 или 4 цифрам.

Обратите внимание, что в целомШаблон регулярного выражения заключен в группу захвата, это необходимо потому, что для работы .str.extract требуется хотя бы одна группа захвата, он выдаст только захваченный текст.

Чтобы сопоставить даты, не входящие в другие цифры, вы можетедобавьте (?<!\d) в начале и (?!\d) в конце, это может сделать шаблон более безопасным.

Если вы планируете соответствовать любому английскому названию месяца, вам нужно немного расширить шаблон:

r"(?<!\d)(\d{1,2}[/. ](?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?))[/. ]\d{2}(?:\d{2})?)(?!\d)"

См. еще одну демонстрацию регулярных выражений .

Подробности

  • (?<!\d) - цифры слева не допускаются
  • ( - начало группы захвата
  • \d{1,2} - 1 или 2 цифры
  • [/. ] - пробел, / или .
  • (?:\d{1,2}|(?:J(?:an(?:uary)?|u(?:ne?|ly?))|Feb(?:ruary)?|Ma(?:r(?:ch)?|y)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:t(?:ember)?)?|(?:Nov|Dec)(?:ember)?|Oct(?:ober)?)) - название месяца, сокращенное или нет
  • [/. ] - пробел, / или .
  • \d{2}(?:\d{2})? - 2 цифры с дополнительнымпоследовательность из двух цифр
  • ) - конец группы захвата
  • (?!\d) - цифра сразу справа не допускается
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...