[python] Python에서 0이 아닌 패딩 된 타임 스탬프 구문 분석

다음과 같은 타임 스탬프에서 datetimes를 얻고 싶습니다 : 3/1/2014 9:55with datetime.strptime또는 이와 동등한 것.

월, 일 및 시간은 0으로 채워지지 않지만 여기 에 자동으로 구문 분석 할 수 있는 형식 지정 지시문이없는 것 같습니다 .

그렇게하는 가장 좋은 방법은 무엇입니까? 감사!



답변

strptime패딩되지 않은 값을 구문 분석 할 수 있습니다. 형식화 코드 테이블에서 패딩 된 것으로 표시된다는 사실은 strftime의 출력에 적용됩니다 . 그래서 당신은 사용할 수 있습니다

datetime.strptime(datestr, "%m/%d/%Y %H:%M")


답변

strptime0으로 채워진 값이 필요하지 않습니다. 아래 예 참조

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)


답변

이 답변이 다른 사람에게 도움이되는 경우를 대비하여 제로 패딩에 문제가 있다고 생각했지만 실제로는 12:00 대 00:00 및 %I포맷터 와 관련이 있습니다.

%I포맷터는 선택적으로 제로 패딩, 12 시간 시계의 시간과 일치하기위한 것입니다. 그러나 데이터 소스에 따라 자정이나 정오가 실제로 0이라는 데이터를 얻을 수 있습니다. 예 :

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'

무엇 strptime실제로 원한 것은 (12)이 아닌 영 (0) :

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)

그러나 우리가 항상 데이터 소스를 제어하는 ​​것은 아닙니다! 이 엣지 케이스에 대한 나의 해결책은 예외를 포착하고 %H우리가 있다고 생각하는 엣지 케이스에 있는지 빠르게 확인하여.

def get_datetime(string):
    try:
        timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
    except ValueError:
        # someone used zero for midnight?
        timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
        assert string.lower().endswith('am')
        assert timestamp.hour == 0
    return timestamp


답변

여기 에서 strftime 문서를 볼 수 있습니다 . 그러나 사실 모든 플랫폼에서 모두 %-d,%-m잘 작동하는 것은 아닙니다. 예를 들어, 파이썬 2.7로 win7에서 작동하지 않습니다. 따라서 다음과 같이 수행 할 수 있습니다.

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())
>>> print(date_str)
2016-5-23


답변

패턴이 아닌 방법은 dateutil.parse모듈을 사용 하는 것입니다. 현재 사용중인 내용을 모르더라도 일반적인 날짜 형식을 구문 분석 할 수 있습니다

.

>>> import dateutil.parser
>>> 
>>> utc_time     = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale  = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)


답변