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


84

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

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

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

답변:


131

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

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

8

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

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

2

이 답변이 다른 사람에게 도움이되는 경우를 대비하여 제로 패딩에 문제가 있다고 생각했지만 실제로는 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

0:12am잘못된 입력입니다. 이어야합니다 12:12am. 11:59 pm뒤에 12:00 am, 아니라 0:00am. 잘못된 시간 형식으로 데이터를 제공하는 다양한 방법이있을 수 있습니다. 예를 들어 입력 %y에 4 자리 연도 ( ) 대신 2 자리 연도 ( )가 사용 %Y되거나 일 / 월이 바뀔 수 있습니다 ( %m/%d%d/%m) 등이 있습니다. 월 대소 문자가 모호 할 수 있습니다. 예를 들어 2015/10/12"10 월 12 일"또는 "12 월 10 일"입니까? btw, %Y/%m/%d대신 %m/%d/%Y입력 형식을 일치 시켜야 합니다.
jfs

감사합니다. 제가 말했듯이 제가 제어하지 않는 데이터 소스에서 나온 것이 잘못된 입력이라는 것을 알고 있습니다.
hwjp

2

여기 에서 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

1
기본 Windows에서는 해시가 대시 ( %#d, )로 대체됩니다 %#m. 그러나 대시 모드와 해시 모드는 모두 strftime구문 분석 ( strptime)이 아닌 문자열 형식 ( ) 에만 필요합니다 .
Nuno André

1

패턴이 아닌 방법은 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.