Python에서 문자열을 datetime으로 변환

개요

데이터는 다양한 형태로 표현될 수 있으며 날짜와 시간을 표현하는 편리한 방법은 다음과 같습니다. 문자열. 그러나 이러한 날짜와 시간을 산술 방식(예: 시차 계산, 시간 추가 또는 제거 등)으로 작업하려면 이를 datetime 목적.

가장 일반적인 출처 중 하나 문자열 형식 날짜/시간 다른 형식으로 변환할 수 있는 독립적인 문자열을 반환하는 REST API입니다.

또한 시간대는 날짜/시간 객체로 작업할 때 흔히 발생하는 골칫거리이므로 변환하는 동안에도 이에 대해 생각해야 합니다.

이 가이드에서는 문자열 날짜/시간을 문자열로 변환하는 방법을 살펴보겠습니다. datetime 내장 함수를 사용하여 Python의 객체 datetime 모듈뿐만 아니라 다음과 같은 타사 모듈 dateutil, arrow 시간대를 설명하는 Maya.

datetime을 사용하여 문자열 변환

XNUMXD덴탈의 날짜 시간 모듈은 세 가지 객체 유형으로 구성됩니다. date, timedatetime. 그만큼 date 개체는 날짜를 보유하고 있습니다. time 시간을 잡고, datetime 날짜와 시간을 모두 보유!

import datetime
print(f'Current date/time: {datetime.datetime.now()}')

이 코드를 실행하면 다음과 같은 결과가 발생합니다.

Current date/time: 2022-12-01 10:27:03.929149

사용자 정의 형식이 지정되지 않은 경우 기본 문자열 형식이 사용됩니다. 즉, "2022-12-01 10:27:03.929149"의 형식은 ISO 8601 체재 (YYYY-MM-DDTHH:MM:SS.mmmmmm). 입력 문자열이 datetime 개체가 동일한 ISO 8601 형식이거나 미리 받을 형식을 알고 있는 경우 쉽게 구문 분석하여 datetime 목적:

import datetime

date_time_str = '2022-12-01 10:27:03.929149'

date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

실행하면 날짜, 시간 및 날짜-시간이 인쇄됩니다.

Date: 2022-12-01
Time: 10:27:03.929149
Date-time: 2022-12-01 10:27:03.929149

여기서 우리는 strptime() 다음 두 가지 인수를 허용하는 메서드:

  • 문자열 형식의 날짜
  • 첫 번째 인수의 형식

이와 같은 형식을 지정하면 구문 분석이 훨씬 빨라집니다. datetime 자체적으로 형식을 시도하고 해석할 필요가 없으며 계산 비용이 훨씬 더 많이 듭니다. 반환 값은 다음 유형입니다. datetime.

우리의 예에서, "2022-12-01 10:27:03.929149" 입력 문자열이고 "%Y-%m-%d %H:%M:%S.%f" 날짜 문자열의 형식입니다. 반환 datetime 값은 다음과 같이 저장됩니다. date_time_obj.

이 때문에 datetime 개체, 우리는 호출할 수 있습니다 date()time() 그것에 직접 방법. 출력에서 볼 수 있듯이 입력 문자열의 '날짜' 및 '시간' 부분을 인쇄합니다!

포맷 토큰

이해하는 데 시간을 할애할 가치가 있습니다. 형식 토큰 - "%Y-%m-%d %H:%M:%S.%f" 이전부터.

각 토큰은 일, 월, 연도, 일 또는 주 등과 같이 날짜-시간의 다른 부분을 나타냅니다. 지원되는 토큰 목록 다양한 서식을 사용할 수 있을 만큼 충분히 광범위합니다. 우리가 이전에 사용했던 일반적으로 사용되는 것 중 일부는 다음과 같습니다.

  • %Y: 연도(4자리)
  • %m: 월
  • %d: 일
  • %H: 시(24시간)
  • %M: 분
  • %S: 초
  • %f: 마이크로초

참고 : 연도를 제외한 모든 토큰은 제로 패딩될 것으로 예상됩니다(즉, 8월은 XNUMX번째 달이며 08).

strptime() 형식 토큰을 사용하여 문자열을 다른 날짜/시간 형식으로 변환

문자열의 형식을 알고 있으면 쉽게 구문 분석할 수 있습니다. datetime 사용하는 개체 strptime(). 한 형식에서 다른 형식으로 변환하는 간단한 예를 살펴보겠습니다.

import datetime

date_time_str = 'Jul 17 2022 9:20AM'
date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p')

print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)

입력 문자열은 "Jul 17 2022 9:20AM" 형식이었습니다. 이 형식을 알고 구성 요소를 ISO 8601 형식으로 매핑하고 datetime 목적:

Date: 2022-07-17
Time: 09:20:00
Date-time: 2022-07-17 09:20:00

다음은 일반적인 문자열 형식 날짜 시간 및 해당 형식의 짧은 목록입니다. strptime():

"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p"
"September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S"
"Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p"
"Mon, 21 March, 2015" -> "%a, %d %B, %Y"
"2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"

수신하는 입력에 대해 올바른 형식 토큰 문자열을 사용하는 한 모든 형식의 날짜-시간 문자열을 구문 분석할 수 있습니다.

시간대를 사용하여 문자열을 날짜/시간으로 변환

시간대를 처리하는 동안 날짜-시간 처리가 더 복잡해집니다. 지금까지 위의 모든 예는 시간대에 순진합니다. 이들은 다음과 같이 알려져 있습니다. 순진한 datetime 객체.

그러나, datetime 개체에는 시간대 관련 데이터를 저장하기 위한 필드가 포함되어 있습니다. tzinfo:

import datetime as dt
dtime = dt.datetime.now()

print(dtime) 
print(dtime.tzinfo) 

XNUMXD덴탈의 tzinfo 필드는 datetime.timezone 시간대 정보를 나타내는 객체. 그것은 None 기본적으로 및 는 datetime 객체가 timezone-naive임을 나타냅니다. 시간대를 처리하기 위한 매우 일반적인 외부 라이브러리는 다음과 같습니다. pytz. 당신은 설정할 수 있습니다 피츠 개체로 tzinfo 필드도.

아직 가지고 있지 않다면 다음을 통해 설치하십시오.

$ pip install pytz

PyTz를 사용하여 UTC와 같은 시간대 인식 날짜/시간에 대한 앵커를 만들 수 있습니다.

import datetime as dt
import pytz

dtime = dt.datetime.now(pytz.utc)

print(dtime)
print(dtime.tzinfo)

출력:

2022-12-01 02:07:41.960920+00:00
UTC

더 이상 오전 11시가 아니라 오전 2시입니다. 시간대를 몇 시간 뒤로 설정했기 때문입니다! 이것 시간대 변경 날짜 시간의.

+00:00 표시된 시간과 글로벌 조정 앵커인 UTC 시간의 차이입니다. 시간을 UTC로 설정했으므로 오프셋은 00:00. 이것은이다 시간대 인식 객체.

마찬가지로 시간대 간에 동일한 날짜/시간 해석을 전환할 수 있습니다. "2022-06-29 17:08:00"과 같은 문자열을 datetime으로 변환한 다음 현지화하다 "America/New_York" 시간대:

import datetime as dt
import pytz

date_time_str = '2022-06-29 17:08:00'
date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')

timezone = pytz.timezone('America/New_York')
timezone_date_time_obj = timezone.localize(date_time_obj)

print(timezone_date_time_obj)
print(timezone_date_time_obj.tzinfo)

참고 : 현지화 시간대 순진한 날짜 시간을 시간대 인식 날짜 시간으로 바꾸고 시간대를 로컬로 취급합니다. 그래서 datetime은 동일하게 유지됩니다., 그러나 다른 시간대가 주어지면 시간대에서 바인딩되지 않은 동일한 시점을 더 이상 나타내지 않습니다.

우리는 같은 것을 얻는다 날짜/시간 값, 오프셋 -04 : 00 UTC 시간과 비교:

2022-06-29 17:08:00-04:00
America/New_York

17:08 도쿄 ~이 아니다. 뉴욕의 17:08과 같은 시점. 도쿄의 17:08은 뉴욕의 3:08입니다.

모든 시간대 코드/별칭을 찾는 방법은 무엇입니까?

사용 가능한 모든 시간대를 찾으려면 all_timezones 사용 가능한 모든 시간대 목록인 필드:

print(f'There are {len(pytz.all_timezones)} timezones in PyTzn')
for time_zone in pytz.all_timezones:
   print(time_zone)

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

There are 594 timezones in PyTz

Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
...

Datetime의 시간대 변경

시간대를 인식하는 시간대를 변환할 수 있습니다. datetime 일부 시간대의 렌즈를 통해 시간대 순진한 날짜 시간을 현지화하는 대신 한 지역에서 다른 지역으로 개체를 이동합니다.

현지화는 다른 시점을 나타내지만 객체의 시간대를 변환하는 것은 다른 렌즈를 통해 동일한 시점을 나타내므로 현지화와 다릅니다.

import datetime as dt
import pytz

timezone_nw = pytz.timezone('America/New_York')
nw_datetime_obj = dt.datetime.now(timezone_nw)

timezone_london = pytz.timezone('Europe/London')
london_datetime_obj = nw_datetime_obj.astimezone(timezone_london)


print('America/New_York:', nw_datetime_obj)
print('Europe/London:', london_datetime_obj)

먼저 현재 시간을 사용하여 하나의 datetime 객체를 생성하고 "America/New_York" 시간대로 설정했습니다. 그런 다음 astimezone() 방법, 우리는 이것을 변환했습니다 datetime "유럽/런던" 시간대에. 둘 다 datetimes는 UTC 오프셋을 참조 링크로 사용하여 다른 값을 인쇄합니다.

America/New_York: 2022-11-30 21:24:30.123400-05:00
Europe/London: 2022-12-01 02:24:30.123400+00:00

2:24 다음날 런던에서 is 뉴욕에서 전날 21시 24분과 같은 시점 런던이 5시간 앞서 있기 때문입니다.

예상대로 날짜-시간은 5시간 정도 차이가 나기 때문에 서로 다릅니다.

타사 라이브러리를 사용하여 문자열을 날짜/시간으로 변환

파이썬 datetime 모듈은 모든 다른 유형의 문자열을 datetime 물체. 그러나 주요 문제는 이렇게 하려면 적절한 서식 지정 코드 문자열을 생성해야 한다는 것입니다. strptime() 이해할 수 있습니다. 이 문자열을 만드는 데는 시간이 걸리고 코드를 읽기가 더 어려워집니다.

대신 다른 타사 라이브러리를 사용하여 더 쉽게 만들 수 있습니다.

경우에 따라 이러한 타사 라이브러리에는 날짜-시간 조작 및 비교에 대한 더 나은 내장 지원 기능이 있으며 일부에는 시간대가 내장되어 있으므로 추가 PyTz 패키지를 포함할 필요가 없습니다.

다음 섹션에서 이러한 라이브러리 중 몇 가지를 살펴보겠습니다.

dateutil을 사용하여 문자열을 Datetime으로 변환

XNUMXD덴탈의 날짜 유틸리티 모듈 에 대한 확장입니다. datetime 기준 치수. 한 가지 장점은 문자열을 구문 분석하기 위해 구문 분석 코드를 전달할 필요가 없다는 것입니다!

Python을 사용하여 형식 토큰 없이 문자열을 날짜/시간으로 자동 변환하려면 dateutil:

from dateutil.parser import parse
datetime = parse('2018-06-29 22:21:41')

print(datetime)

parse 함수는 문자열을 자동으로 구문 분석합니다! 형식 문자열을 포함할 필요가 없습니다. 다음을 사용하여 다양한 유형의 문자열을 구문 분석해 봅시다. dateutil:

from dateutil.parser import parse

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = parse(date)
    print(dt.date())
    print(dt.time())
    print(dt.tzinfo)
    print('n')

출력:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29
08:15:27.243860
None

Parsing: Jun 28 2018 7:40AM
2018-06-28
07:40:00
None

Parsing: Jun 28 2018 at 7:40AM
2018-06-28
07:40:00
None

Parsing: September 18, 2017, 22:19:55
2017-09-18
22:19:55
None

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12
12:30:00
None

Parsing: Mon, 21 March, 2015
2015-03-21
00:00:00
None

Parsing: 2018-03-12T10:12:45Z
2018-03-12
10:12:45
tzutc()

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29
17:08:00.586525
tzutc()

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29
17:08:00.586525
tzoffset(None, 18000)

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06
16:30:00
None

거의 모든 유형의 문자열을 다음을 사용하여 쉽게 구문 분석할 수 있음을 알 수 있습니다. dateutil 기준 치수.

이 방법이 편리하긴 하지만 형식을 예측해야 하므로 코드 속도가 훨씬 느려지므로 코드에 고성능이 필요한 경우에는 이 방법이 응용 프로그램에 적합하지 않을 수 있습니다.

Maya를 사용하여 문자열을 날짜/시간으로 변환

마야 또한 문자열을 구문 분석하고 시간대를 변경하는 것이 매우 쉽습니다. Python의 Maya로 문자열을 쉽게 변환하려면:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime()
print(dt.date())
print(dt.time())
print(dt.tzinfo)

출력:

2018-04-29
17:45:25
UTC

시간을 다른 시간대로 변환하려면:

import maya

dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False)
print(dt.date())
print(dt.time())
print(dt.tzinfo)

출력:

2018-04-29
13:45:25
America/New_York

이제 사용하기 쉽지 않습니까? 시도해 보자 maya 우리가 사용한 것과 동일한 문자열 세트로 dateutil:

import maya

date_array = [
    '2018-06-29 08:15:27.243860',
    'Jun 28 2018 7:40AM',
    'Jun 28 2018 at 7:40AM',
    'September 18, 2017, 22:19:55',
    'Sun, 05/12/1999, 12:30PM',
    'Mon, 21 March, 2015',
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    'Tuesday , 6th September, 2017 at 4:30pm'
]

for date in date_array:
    print('Parsing: ' + date)
    dt = maya.parse(date).datetime()
    print(dt)
    
    
    
    

출력:

Parsing: 2018-06-29 08:15:27.243860
2018-06-29 08:15:27.243860+00:00

Parsing: Jun 28 2018 7:40AM
2018-06-28 07:40:00+00:00

Parsing: Jun 28 2018 at 7:40AM
2018-06-28 07:40:00+00:00

Parsing: September 18, 2017, 22:19:55
2017-09-18 22:19:55+00:00

Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12 12:30:00+00:00

Parsing: Mon, 21 March, 2015
2015-03-21 00:00:00+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12 10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29 17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29 12:08:00.586525+00:00

Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06 16:30:00+00:00

보시다시피 모든 날짜 형식이 성공적으로 구문 분석되었습니다!

시간대 정보를 제공하지 않으면 자동으로 UTC로 변환됩니다. 따라서 우리가 절대로 필요한 것 제공 to_timezonenaive 시간이 UTC가 아닌 경우 매개변수입니다.

화살표를 사용하여 문자열을 날짜/시간으로 변환

화살 Python에서 datetime을 처리하기 위한 또 다른 라이브러리입니다. 그리고 예전처럼 maya, 또한 날짜/시간 형식을 자동으로 파악합니다. 일단 해석되면 Python을 반환합니다. datetime 에서 개체 arrow 목적.

Python을 사용하여 문자열을 datetime으로 쉽게 변환하려면 arrow:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z')
print(dt.date())
print(dt.time())
print(dt.tzinfo)

출력:

2018-04-29
17:45:25
tzutc()

그리고 여기 당신이 사용할 수있는 방법입니다 arrow 시간대를 변환하려면 to() 방법:

import arrow

dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York')
print(dt)
print(dt.date())
print(dt.time())

출력:

2018-04-29T13:45:25-04:00
2018-04-29
13:45:25

보시다시피 날짜-시간 문자열이 "America/New_York" 지역으로 변환됩니다.

이제 위에서 사용한 것과 동일한 문자열 집합을 다시 사용하겠습니다.

import arrow

date_array = [
    '2018-06-29 08:15:27.243860',
    
    
    
    
    
    '2018-03-12T10:12:45Z',
    '2018-06-29 17:08:00.586525+00:00',
    '2018-06-29 17:08:00.586525+05:00',
    
]

for date in date_array:
    dt = arrow.get(date)
    print('Parsing: ' + date)
    print(dt)
    
    
    
    

이 코드는 예제의 절반 이상인 주석 처리된 날짜-시간 문자열에 대해 실패합니다. 다른 문자열의 출력은 다음과 같습니다.

Parsing: 2018-06-29 08:15:27.243860
2018-06-29T08:15:27.243860+00:00

Parsing: 2018-03-12T10:12:45Z
2018-03-12T10:12:45+00:00

Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29T17:08:00.586525+00:00

Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29T17:08:00.586525+05:00

주석 처리된 날짜-시간 문자열을 올바르게 구문 분석하려면 해당 문자열을 전달해야 합니다. 형식 토큰 라이브러리에 구문 분석 방법에 대한 단서를 제공합니다.

결론

이 기사에서 우리는 문자열을 datetime 파이썬의 객체. 기본 Python을 선택할 수 있습니다. datetime 라이브러리 또는 이 문서에서 언급한 타사 라이브러리 등이 있습니다.

기본값의 주요 문제 datetime 패키지는 거의 모든 날짜-시간 문자열 형식에 대해 구문 분석 코드를 수동으로 지정해야 한다는 것입니다. 따라서 나중에 문자열 형식이 변경되면 코드도 변경해야 할 수 있습니다. 그러나 여기에 언급된 것과 같은 많은 타사 라이브러리는 이를 자동으로 처리합니다.

우리가 직면한 또 다른 문제는 시간대를 다루는 것입니다. 이를 처리하는 가장 좋은 방법은 항상 데이터베이스에 시간을 UTC 형식으로 저장한 다음 필요할 때 사용자의 현지 시간대로 변환하는 것입니다.

이러한 라이브러리는 문자열을 구문 분석하는 데 유용할 뿐만 아니라 다양한 유형의 날짜-시간 관련 작업에도 사용할 수 있습니다. 기능을 자세히 알아보려면 문서를 살펴보는 것이 좋습니다.

타임 스탬프 :

더보기 스택카부스