파이썬에서 날짜 문자열 형식을 어떻게 확인합니까?


143

날짜 입력을 문자열로 받아들이는 python 메소드가 있습니다.

메소드에 전달되는 날짜 문자열이 ffg에 있는지 확인하기 위해 유효성 검증을 추가하는 방법 체재:

'YYYY-MM-DD'

그렇지 않은 경우 메소드는 일종의 오류를 발생시켜야합니다.


2
전혀 확인하지 않고 결과로 발생하는 예외를 포착하지 않는 것이 더 Pythonic 일 수 있습니다 (권한이 아닌 용서 요청).
토마스

답변:


230
>>> import datetime
>>> def validate(date_text):
    try:
        datetime.datetime.strptime(date_text, '%Y-%m-%d')
    except ValueError:
        raise ValueError("Incorrect data format, should be YYYY-MM-DD")


>>> validate('2003-12-23')
>>> validate('2003-12-32')

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    validate('2003-12-32')
  File "<pyshell#18>", line 5, in validate
    raise ValueError("Incorrect data format, should be YYYY-MM-DD")
ValueError: Incorrect data format, should be YYYY-MM-DD

8
시도 / 제외없이 그렇게하는 방법이 있습니까? 예외가 발생하고 잡히면 파이썬이 크게 느려지는 경향이 있습니다.
chiffa

1
@chiffa 날짜 형식 정규식과 일치시킬 수는 있지만 덜 강력하고 예외가 명확하기 때문에 권장하지 않습니다. 날짜 유효성 검사에 병목이 있습니까?
jamylak

1
실제로는 아니므로 결국에는 함수에서 throw-except 구문을 래핑합니다. datetime 라이브러리에서 Exception throw를 트리거하는 bool-returning 유효성 검사 기능이 없다는 사실에 놀랐습니다.
chiffa

@chiffa은 어쩌면 그들은 부울 목적에 기능을 확인하는 반환, 그것은 외부 라이브러리에있을 수 있습니다 포함 didnt는
jamylak

2
날짜에 제로 패딩을 원하는 사람들에게는 strptime이 제로 패딩에 대해 엄격하지 않기 때문에이 솔루션은 작동하지 않습니다. 공백을 제거한 후 자신의 정규식을 구현하거나 결과 문자열의 길이를 확인한 다음이 솔루션을 사용하십시오.
Suparshva

65

파이썬dateutil 라이브러리 (등)이 설계되었습니다. 자동으로 이것을 datetime당신을 위해 객체 로 변환 하고 ValueError그것을 할 수 없다면 그것을 올릴 것입니다.

예로서:

>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)

ValueError날짜가 올바르게 포맷되지 않은 경우 a가 발생합니다.

>>> parse("2003-09-251")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

dateutil또한 알려진 형식을 지능적으로 처리하고 사양을 수정할 수 있으므로 향후 다른 형식을 구문 분석해야 할 경우 매우 유용합니다. dateutil구문 분석 예제 .

또한 필요한 경우 시간대를 처리합니다.

주석 기반 업데이트 : 날짜가 모호한 경우 날짜 또는 월이 먼저 올지 여부를 제어 parse하는 키워드 인수도 허용 dayfirst합니다. 기본값은 False입니다. 예 :

>>> parse('11/12/2001')
>>> datetime.datetime(2001, 11, 12, 0, 0) # Nov 12
>>> parse('11/12/2001', dayfirst=True)
>>> datetime.datetime(2001, 12, 11, 0, 0) # Dec 11

1
예를 들어 "12 월 parse('13/12/2001')13 일"이지만 parse('11/12/2001')"11 월 12 일"입니다 (첫 번째 결과는 "11 12 월"입니다).
jfs

2
parse실제로 dayfirst이를 제어 할 수 있는 키워드 인수를 사용합니다. parse('11/12/2001', dayfirst=True)12 월 11 일을 반환합니다. dateutil의 기본값은dayfirst=False
Jacinda

datetutil.parser.parse()너무 많은 시간 형식 을 허용 하는 요점이 누락되었습니다 (모호한 입력으로 다른 예를 찾을 수 있음). 당신이 할 경우 확인 하여 입력 YYYY-MM-DD 형식으로되어 있음을 다음 parse()함수가 잘못된 도구입니다.
jfs

1
그것은 완전히 유효한 포인트입니다-당신이 정말로 그 특정 형식으로 제한하고 싶다면 이것이 그렇게하지 않으며, 받아 들여진 대답은 이미 그 경우에 올바른 일을하는 훌륭한 일을합니다. 나는 대답을 쓸 때 저자가 요청한 특정 형식과 반대로 유효한 날짜인지 여부를 확인하는 방법에 대해 더 많이 생각하고 있다고 생각합니다. 찾고있는.
Jacinda

객체 .parse()외에도 형식 문자열을 반환 하는 방법이 datetime있습니까?
citynorman

35

전체 유효성 검사 기능은 다음과 같아야한다고 생각합니다.

from datetime import datetime

def validate(date_text):
    try:
        if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
            raise ValueError
        return True
    except ValueError:
        return False

그냥 실행

datetime.strptime(date_text, "%Y-%m-%d") 

strptime 메소드는 월과 일이 0으로 채워진 10 진수인지 확인하지 않으므로 충분하지 않습니다. 예를 들어

datetime.strptime("2016-5-3", '%Y-%m-%d')

오류없이 실행됩니다.


3
"당신은 기술적으로 정확합니다 – 가장 좋은 종류입니다." 나는 이것을 내 문자열로 보장해야했습니다.
delrocco

이것은 내 테스트에 대해 잘 작동하지만 "% d-> 0으로 채워진 10 진수로 월의 일-> 01, 02,…, 31"과 같은 % m에 대한 문서는 잘못된 것으로 보입니다. -> 월은 0으로 채워진 10 진수입니다. -> 01, 02,…, 12 docs.python.org/2/library/…
thanos.a

월과 일이 0으로 채워져 있는지 확인 해야하는 경우 문자열의 길이를 확인하는 것만으로 충분하지 datetime.strptime(date_text, "%Y-%m-%d")않습니까?
카일 배런

17
from datetime import datetime

datetime.strptime(date_string, "%Y-%m-%d")

..이 제기는 ValueError호환되지 않는 포맷을 수신하는 경우.

.. 날짜 및 시간을 많이 처리하는 경우 (유닉스 타임 스탬프 플로트와 달리 datetime 객체의 관점에서) pytz 모듈을 살펴보고 저장 / db의 경우 모든 것을 UTC로 저장하는 것이 좋습니다 .


2
당신은 더 빨랐습니다, 나는 그것을 직접 게시했을 것입니다 ( ideone.com/vuxDDf ). 공감.
Tadeck

.. 게시 된 직후 확인했으며 오늘 datetime 객체로 작업하고 있습니다.
Mr. B

-7

가장 쉬운 방법입니다.

date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')

2
코드 만 설명하는 것이 좋습니다.
lukas_o
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.