다음과 같은 타임 스탬프에서 datetimes를 얻고 싶습니다 : 3/1/2014 9:55
with datetime.strptime
또는 이와 동등한 것.
월, 일 및 시간은 0으로 채워지지 않지만 여기 에 자동으로 구문 분석 할 수 있는 형식 지정 지시문이없는 것 같습니다 .
그렇게하는 가장 좋은 방법은 무엇입니까? 감사!
답변:
이 답변이 다른 사람에게 도움이되는 경우를 대비하여 제로 패딩에 문제가 있다고 생각했지만 실제로는 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
%#d
, )로 대체됩니다 %#m
. 그러나 대시 모드와 해시 모드는 모두 strftime
구문 분석 ( strptime
)이 아닌 문자열 형식 ( ) 에만 필요합니다 .
패턴이 아닌 방법은 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)
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
입력 형식을 일치 시켜야 합니다.