Python의 문자열에서 날짜 추출


82

"monkey 2010-07-10 love banana"와 같은 문자열에서 날짜를 추출하려면 어떻게해야합니까? 감사!


3
힌트 : 숫자로 시작하고 끝납니다. 그것에 대해 생각해 보겠습니다. 하지만 정규식은 친구가 될 수 있습니다.
Hamish Grubijan

답변:


82

날짜가 고정 된 형식으로 제공되는 경우 정규식을 사용하여 날짜를 추출하고 "datetime.datetime.strptime"을 사용하여 날짜를 구문 분석 할 수 있습니다.

import re
from datetime import datetime

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()

그렇지 않으면 날짜가 임의의 형식으로 주어지면 쉽게 추출 할 수 없습니다.


1
'1980 년 1 월 20 일'을 의미하는 1980 년 1 월 20 일과 같이 유럽 형식이면 어떻게 되나요? 월 / 일 / 년이 합리적인 범위를 벗어나면 어떻게됩니까?
Hamish Grubijan

@lunaryorn 첫 번째 문장에서 "re"는 원하는 패턴을 찾는 문자열을 의미합니까?
vishal

@ vishal.k 내장 re모듈, 즉 import re.
lunaryorn

경우 다른 사람이 같은 실수를 : 당신이 필요로 from datetime import datetime대신import datetime
dankal444

155

사용 파이썬 dateutil를 :

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)

잘못된 날짜 발생 ValueError:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month

다양한 형식의 날짜를 인식 할 수 있습니다.

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)

날짜가 모호한 경우 추측을합니다.

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)

그러나 모호한 날짜를 구문 분석하는 방법은 사용자 정의 할 수 있습니다.

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)

3
@Hamish : 두 개의 날짜 (의 경우 "monkey 10/01/1980 love 7/10/2010 banana") 가있는 경우 ValueError가 발생하거나 (의 경우 "monkey 10/01/1980 love 2010-07-10 banana") 두 번째 날짜가 시간, 분, 초 또는 시간대를 나타내는 것으로 잘못 해석 될 수 있습니다. fuzzy=True추측 할 수있는 라이센스를줍니다.
unutbu

1
@unutbu str = "By flufie  · 2010 년 10 월 14 일 오후 11:22  · 26 개의 답글"dateutil을 사용하여 "ValueError : 시간은 0..23에 있어야합니다."
saravanan

텍스트에 둘 이상의 날짜가 있으면 어떻게됩니까?
alvas 2015 년

1
@alvas :이 parse함수는 예외를 발생시킬 수 있습니다 (일지라도 fuzzy=True). 또는을 사용 fuzzy=True하면 첫 번째 날짜 또는 두 날짜의 일부로 구성된 mish-mash를 반환 할 수 있습니다. 따라서 실제로 parse는 하나의 날짜를 포함하는 문자열에서만 호출되어야합니다.
unutbu

1
@Kailegh : 예, fuzzy_with_tokens = True를 사용하여 인덱스 를 추론 할 수 있습니다 . 더 자세한 설명을 원하시면 새 질문을 시작하십시오.
unutbu

27

Python의 문자열에서 날짜를 추출합니다. 사용 가능한 최고의 모듈은 datefinder 모듈입니다.

아래 주어진 간단한 단계에 따라 Python 프로젝트에서 사용할 수 있습니다.

1 단계 : datefinder 패키지 설치

pip install datefinder

2 단계 : 프로젝트에서 사용

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'

참고 : 많은 수의 일치가 예상되는 경우; 그러면 목록에 대한 형변환은 성능 오버 헤드가 크기 때문에 권장되는 방법이 아닙니다.


1
그 발견 datefinder보다 손 모호한 날짜 매칭 더 나은 python-dateutil오와 달리 임의의 medium.com 블로그 게시물에서 두 가능한 날짜를 반환. 확실하지가 ... 그러나 다른 로케일을 처리하는 방법
CpILL

날짜 문자열 앞에 콜론 (:)이 있으면 작동하지 않는다는 점을 제외하면 꽤 좋습니다. string = "Assessment Date: 17-May-2017 at 13:31" list(datefinder.find_dates(string.lower())) #[] string = "Assessment Date 17-May-2017 at 13:31" list(datefinder.find_dates(string.lower())) #[datetime.datetime(2017, 5, 17, 13, 31)]
Narahari BM

그 datefinder 모호한 텍스트 dateparser보다 더 힙을 동의
제이 정

2

Pygrok를 사용하면 정규식 구문에 대한 추상화 된 확장을 정의 할 수 있습니다.

사용자 정의 패턴은 형식으로 정규식에 포함될 수 있습니다 %{PATTERN_NAME}.

콜론으로 구분하여 해당 패턴에 대한 레이블을 만들 수도 있습니다 %s{PATTERN_NAME:matched_string}.. 패턴과 일치하는 경우, 값이 사전 생성의 일부로서 리턴한다 (예 result.get('matched_string'))

예를 들면 :

from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))

결과 값은 사전이됩니다.

{'month': '07', 'day': '10', 'year': '2010'}

date_pattern이 input_string에 없으면 반환 값은 None. 반대로 패턴에 레이블이없는 경우 빈 사전을 반환합니다.{}

참조 :


이 lib 즉 매우 Python 2
Walter

1

dateparser 모듈을 사용해 볼 수도 있습니다.이 모듈 은 자유 텍스트에서 datefinder 보다 느릴 수 있지만 더 많은 잠재적 사례와 날짜 형식은 물론 많은 언어를 포함해야합니다.


-5

문자열 (예 : 로그 파일)에서 날짜 객체의 위치를 ​​알고있는 경우 .split () [index]를 사용하여 형식을 완전히 몰라도 날짜를 추출 할 수 있습니다.

예를 들면 :

>>> string = 'monkey 2010-07-10 love banana'
>>> date = string.split()[1]
>>> date
'2010-07-10'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.