다음과 같은 타임 스탬프에서 datetimes를 얻고 싶습니다 : 3/1/2014 9:55
with datetime.strptime
또는 이와 동등한 것.
월, 일 및 시간은 0으로 채워지지 않지만 여기 에 자동으로 구문 분석 할 수 있는 형식 지정 지시문이없는 것 같습니다 .
그렇게하는 가장 좋은 방법은 무엇입니까? 감사!
답변
strptime
패딩되지 않은 값을 구문 분석 할 수 있습니다. 형식화 코드 테이블에서 패딩 된 것으로 표시된다는 사실은 strftime
의 출력에 적용됩니다 . 그래서 당신은 사용할 수 있습니다
datetime.strptime(datestr, "%m/%d/%Y %H:%M")
답변
strptime
0으로 채워진 값이 필요하지 않습니다. 아래 예 참조
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)