개요
데이터는 다양한 형태로 표현될 수 있으며 날짜와 시간을 표현하는 편리한 방법은 다음과 같습니다. 문자열. 그러나 이러한 날짜와 시간을 산술 방식(예: 시차 계산, 시간 추가 또는 제거 등)으로 작업하려면 이를 datetime
목적.
가장 일반적인 출처 중 하나 문자열 형식 날짜/시간 다른 형식으로 변환할 수 있는 독립적인 문자열을 반환하는 REST API입니다.
또한 시간대는 날짜/시간 객체로 작업할 때 흔히 발생하는 골칫거리이므로 변환하는 동안에도 이에 대해 생각해야 합니다.
이 가이드에서는 문자열 날짜/시간을 문자열로 변환하는 방법을 살펴보겠습니다.
datetime
내장 함수를 사용하여 Python의 객체datetime
모듈뿐만 아니라 다음과 같은 타사 모듈dateutil
,arrow
시간대를 설명하는 Maya.
datetime을 사용하여 문자열 변환
XNUMXD덴탈의 날짜 시간 모듈은 세 가지 객체 유형으로 구성됩니다. date
, time
및 datetime
. 그만큼 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
"유럽/런던" 시간대에. 둘 다 datetime
s는 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_timezone
와 naive
시간이 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 형식으로 저장한 다음 필요할 때 사용자의 현지 시간대로 변환하는 것입니다.
이러한 라이브러리는 문자열을 구문 분석하는 데 유용할 뿐만 아니라 다양한 유형의 날짜-시간 관련 작업에도 사용할 수 있습니다. 기능을 자세히 알아보려면 문서를 살펴보는 것이 좋습니다.