Python Language
날짜와 시간
수색…
비고
Python은 날짜와 시간을 생성, 수정, 파싱 및 조작하기위한 내장 메소드와 외부 라이브러리를 제공합니다.
문자열을 시간대 인식 datetime 객체로 파싱하기
문자열 을 datetime
객체로 구문 분석 할 때 Python 3.2 이상에서 %z
형식을 지원합니다.
+HHMM
또는-HHMM
(개체가 순진한 경우 빈 문자열) 형식의 UTC 오프셋입니다.
import datetime
dt = datetime.datetime.strptime("2016-04-15T08:27:18-0500", "%Y-%m-%dT%H:%M:%S%z")
다른 Python 버전의 경우 dateutil
과 같은 외부 라이브러리를 사용할 수 있습니다.이 라이브러리는 시간대가있는 문자열을 파싱하여 datetime
객체로 빠르게 만듭니다.
import dateutil.parser
dt = dateutil.parser.parse("2016-04-15T08:27:18-0500")
dt
변수는 이제 다음 값을 갖는 datetime
객체입니다.
datetime.datetime(2016, 4, 15, 8, 27, 18, tzinfo=tzoffset(None, -18000))
간단한 날짜 산술
날짜는 별도로 존재하지 않습니다. 일반적으로 날짜 사이의 시간 간격을 찾거나 내일 날짜를 결정해야합니다. timedelta
객체를 사용하여 수행 할 수 있습니다.
import datetime
today = datetime.date.today()
print('Today:', today)
yesterday = today - datetime.timedelta(days=1)
print('Yesterday:', yesterday)
tomorrow = today + datetime.timedelta(days=1)
print('Tomorrow:', tomorrow)
print('Time between tomorrow and yesterday:', tomorrow - yesterday)
이렇게하면 다음과 유사한 결과가 생성됩니다.
Today: 2016-04-15
Yesterday: 2016-04-14
Tomorrow: 2016-04-16
Difference between tomorrow and yesterday: 2 days, 0:00:00
기본 datetime 객체 사용법
datetime 모듈에는 날짜, 시간 및 datetime의 세 가지 기본 유형이 있습니다.
import datetime
# Date object
today = datetime.date.today()
new_year = datetime.date(2017, 01, 01) #datetime.date(2017, 1, 1)
# Time object
noon = datetime.time(12, 0, 0) #datetime.time(12, 0)
# Current datetime
now = datetime.datetime.now()
# Datetime object
millenium_turn = datetime.datetime(2000, 1, 1, 0, 0, 0) #datetime.datetime(2000, 1, 1, 0, 0)
이러한 객체에 대한 산술 연산은 동일한 데이터 유형에서만 지원되며 유형이 다른 인스턴스로 간단한 산술 연산을 수행하면 TypeError가 발생합니다.
# subtraction of noon from today
noon-today
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.date'
However, it is straightforward to convert between types.
# Do this instead
print('Time since the millenium at midnight: ',
datetime.datetime(today.year, today.month, today.day) - millenium_turn)
# Or this
print('Time since the millenium at noon: ',
datetime.datetime.combine(today, noon) - millenium_turn)
날짜 반복하기
때로는 시작 날짜부터 종료 날짜까지 일정 범위의 날짜를 반복하려고합니다. datetime
라이브러리 및 timedelta
객체를 사용 datetime
작업을 수행 할 수 있습니다.
import datetime
# The size of each step in days
day_delta = datetime.timedelta(days=1)
start_date = datetime.date.today()
end_date = start_date + 7*day_delta
for i in range((end_date - start_date).days):
print(start_date + i*day_delta)
생산하는 제품 :
2016-07-21
2016-07-22
2016-07-23
2016-07-24
2016-07-25
2016-07-26
2016-07-27
짧은 시간대 이름을 가진 문자열을 시간대 인식 datetime 객체로 구문 분석
앞의 예제에서 와 같이 dateutil
라이브러리를 사용하여 시간대 인식 타임 스탬프 를 구문 분석하면 지정된 "짧은"표준 시간대 이름을 사용하여 타임 스탬프를 구문 분석 할 수도 있습니다.
일반적으로 모호한 짧은 시간대 이름 또는 약어로 포맷 된 날짜의 경우 (예 : 중부 표준시, 중부 표준시, 중국 표준시, 쿠바 표준시 등 - 자세한 내용은 여기 에서 찾을 수 있음) 또는 표준 데이터베이스에서 반드시 사용할 수있는 것은 아닙니다 , 시간대 약어와 tzinfo
오브젝트 사이의 맵핑을 지정해야합니다.
from dateutil import tz
from dateutil.parser import parse
ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')
us_tzinfos = {'CST': CT, 'CDT': CT,
'EST': ET, 'EDT': ET,
'MST': MT, 'MDT': MT,
'PST': PT, 'PDT': PT}
dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)
dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)
이것을 실행 한 후 :
dt_est
# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
dt_pst
# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))
이 방법으로 pytz
시간대를 사용하면 제대로 현지화 되지 않습니다 .
from dateutil.parser import parse
import pytz
EST = pytz.timezone('America/New_York')
dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})
이것은 단순히 pytz
시간대를 datetime에 연결합니다.
dt.tzinfo # Will be in Local Mean Time!
# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>
이 메서드를 사용하는 경우 구문 분석 후 datetime의 순진 부분을 다시 localize
해야합니다.
dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))
dt_fixed.tzinfo # Now it's EST.
# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
시간대 인식 datetimes 구축하기
기본적으로 모든 datetime
객체는 순진합니다. 표준 시간대를 인식하려면 tzinfo
개체를 첨부해야합니다.이 개체는 날짜와 시간의 함수로 UTC 오프셋과 표준 시간대 약어를 제공합니다.
고정 오프셋 시간대
UTC의 오프셋 고정 시간대를 들어, 파이썬 3.2 이상에서 datetime
모듈이 제공하는 timezone
클래스의 구체적인 구현 tzinfo
소요 timedelta
하고 (선택 사항) 이름 매개 변수를 :
from datetime import datetime, timedelta, timezone
JST = timezone(timedelta(hours=+9))
dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00
print(dt.tzname())
# UTC+09:00
dt = datetime(2015, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=9), 'JST'))
print(dt.tzname)
# 'JST'
3.2 이전의 Python 버전의 경우 dateutil
과 같은 타사 라이브러리를 사용해야합니다. dateutil
은 동등한 클래스 tzoffset
제공합니다.이 클래스는 dateutil.tz.tzoffset(tzname, offset)
형식의 인수를 취합니다 dateutil.tz.tzoffset(tzname, offset)
offset
은 초 단위로 지정됩니다).
from datetime import datetime, timedelta
from dateutil import tz
JST = tz.tzoffset('JST', 9 * 3600) # 3600 seconds per hour
dt = datetime(2015, 1, 1, 12, 0, tzinfo=JST)
print(dt)
# 2015-01-01 12:00:00+09:00
print(dt.tzname)
# 'JST'
일광 절약 시간이 적용되는 구역
일광 절약 시간이있는 영역의 경우 Python 표준 라이브러리는 표준 클래스를 제공하지 않으므로 타사 라이브러리를 사용해야합니다. pytz
및 dateutil
은 시간대 등급을 제공하는 인기있는 라이브러리입니다.
정적 표준 시간대 외에도 dateutil
은 일광 절약 시간을 사용하는 표준 시간대 클래스를 제공합니다 ( tz
모듈의 설명서 참조). 당신은 사용할 수 있습니다 tz.gettz()
다음에 직접 전달 될 수있는 시간대 개체를 얻을 방법을 datetime
생성자를 :
from datetime import datetime
from dateutil import tz
local = tz.gettz() # Local time
PT = tz.gettz('US/Pacific') # Pacific time
dt_l = datetime(2015, 1, 1, 12, tzinfo=local) # I am in EST
dt_pst = datetime(2015, 1, 1, 12, tzinfo=PT)
dt_pdt = datetime(2015, 7, 1, 12, tzinfo=PT) # DST is handled automatically
print(dt_l)
# 2015-01-01 12:00:00-05:00
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-07-01 12:00:00-07:00
주의 : 버전 2.5.3에서, dateutil
은 모호한 datetime을 올바르게 처리하지 못하며, 항상 나중에 디폴트로 처리됩니다. 예를 들어 2015-11-01 1:30 EDT-4
를 나타내는 dateutil
시간대가있는 개체를 구성하는 방법은 일광 절약 시간 전환 동안 이므로 구성 할 수 없습니다.
사용하는 경우 모든 에지의 경우 제대로 처리 pytz
하지만, pytz
시간대에 직접 생성자를 통해 시간대에 부착 할 수 없습니다. 대신 pytz
표준 시간대는 표준 시간대의 localize
메서드를 사용하여 연결해야합니다.
from datetime import datetime, timedelta
import pytz
PT = pytz.timezone('US/Pacific')
dt_pst = PT.localize(datetime(2015, 1, 1, 12))
dt_pdt = PT.localize(datetime(2015, 11, 1, 0, 30))
print(dt_pst)
# 2015-01-01 12:00:00-08:00
print(dt_pdt)
# 2015-11-01 00:30:00-07:00
pytz
인식 시간대에서 datetime 산술 연산을 수행하는 경우 절대 경과 시간이 필요한 경우 UTC로 계산을 수행하거나 결과에 normalize()
를 호출해야합니다.
dt_new = dt_pdt + timedelta(hours=3) # This should be 2:30 AM PST
print(dt_new)
# 2015-11-01 03:30:00-07:00
dt_corrected = PT.normalize(dt_new)
print(dt_corrected)
# 2015-11-01 02:30:00-08:00
Fuzzy datetime 구문 분석 (텍스트에서 datetime 추출)
"퍼지 (fuzzy)"모드에서 dateutil
구문 분석기 를 사용하여 텍스트의 날짜를 추출 할 수 있습니다. 여기서 날짜의 일부로 인식되지 않는 문자열의 구성 요소는 무시됩니다.
from dateutil.parser import parse
dt = parse("Today is January 1, 2047 at 8:21:00AM", fuzzy=True)
print(dt)
dt
는 이제 datetime
객체 이며 datetime.datetime(2047, 1, 1, 8, 21)
인쇄 된 것을 볼 수 있습니다.
시간대 전환
시간대를 전환하려면 시간대를 인식하는 datetime 객체가 필요합니다.
from datetime import datetime
from dateutil import tz
utc = tz.tzutc()
local = tz.tzlocal()
utc_now = datetime.utcnow()
utc_now # Not timezone-aware.
utc_now = utc_now.replace(tzinfo=utc)
utc_now # Timezone-aware.
local_now = utc_now.astimezone(local)
local_now # Converted to local time.
최소한의 라이브러리로 임의의 ISO 8601 타임 스탬프 파싱
파이썬은 ISO 8601 타임 스탬프를 파싱하는 데 제한된 지원만을하고 있습니다. strptime
경우 정확히 어떤 형식인지 알아야합니다. 합병증으로 datetime
의 datetime
은 ISO 8601 타임 스탬프이며 공백은 구분 기호 및 6 자리 분수입니다.
str(datetime.datetime(2016, 7, 22, 9, 25, 59, 555555))
# '2016-07-22 09:25:59.555555'
그러나 분수가 0이면 분수 부분이 출력되지 않습니다.
str(datetime.datetime(2016, 7, 22, 9, 25, 59, 0))
# '2016-07-22 09:25:59'
그러나이 두 형식은 strptime
대해 다른 형식을 필요로 strptime
. 또한 strptime' does not support at all parsing minute timezones that have a
: in it, thus
2016년 7월 22일 09 : 25 : 59 + 0300은 can be parsed, but the standard format
2016년 7월 22일 9시 25분 59초을 +03 : 00` 할 수 없습니다.
iso8601
이라는 단일 파일 라이브러리가 iso8601
ISO 8601 타임 스탬프와 해당 파일 만 제대로 구문 분석합니다.
분수와 시간대를 지원하고 T
구분자는 모두 단일 함수로 지원합니다.
import iso8601
iso8601.parse_date('2016-07-22 09:25:59')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22 09:25:59+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<FixedOffset '+03:00' ...>)
iso8601.parse_date('2016-07-22 09:25:59Z')
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
iso8601.parse_date('2016-07-22T09:25:59.000111+03:00')
# datetime.datetime(2016, 7, 22, 9, 25, 59, 111, tzinfo=<FixedOffset '+03:00' ...>)
시간대가 설정되어 있지 않으면 iso8601.parse_date
기본값은 UTC입니다. 기본 영역은 default_zone
키워드 인수로 변경할 수 있습니다. 특히이 값이 기본값 대신 None
이면 명시적인 시간대가없는 타임 스탬프는 대신 naive datetimes로 반환됩니다.
iso8601.parse_date('2016-07-22T09:25:59', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59)
iso8601.parse_date('2016-07-22T09:25:59Z', default_timezone=None)
# datetime.datetime(2016, 7, 22, 9, 25, 59, tzinfo=<iso8601.Utc>)
타임 스탬프를 datetime으로 변환
datetime
모듈은 POSIX timestamp
를 ITC datetime
객체로 변환 할 수 있습니다.
Epoch는 1970 년 1 월 1 일 자정입니다.
import time
from datetime import datetime
seconds_since_epoch=time.time() #1469182681.709
utc_date=datetime.utcfromtimestamp(seconds_since_epoch) #datetime.datetime(2016, 7, 22, 10, 18, 1, 709000)
날짜에서 정확하게 월을 뺍니다.
calendar
모듈 사용하기
import calendar
from datetime import date
def monthdelta(date, delta):
m, y = (date.month+delta) % 12, date.year + ((date.month)+delta-1) // 12
if not m: m = 12
d = min(date.day, calendar.monthrange(y, m)[1])
return date.replace(day=d,month=m, year=y)
next_month = monthdelta(date.today(), 1) #datetime.date(2016, 10, 23)
dateutils
모듈 사용하기
import datetime
import dateutil.relativedelta
d = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d")
d2 = d - dateutil.relativedelta.relativedelta(months=1) #datetime.datetime(2013, 2, 28, 0, 0)
시간차 계산
timedelta
모듈은 시간 차이를 계산할 때 편리합니다.
from datetime import datetime, timedelta
now = datetime.now()
then = datetime(2016, 5, 23) # datetime.datetime(2016, 05, 23, 0, 0, 0)
새 datetime
객체를 만들 때 시간 지정은 선택 사항입니다.
delta = now-then
delta
는 timedelta
유형입니다.
print(delta.days)
# 60
print(delta.seconds)
# 40826
데이트하기 전에 n 일 후와 n 일 전에 우리는 다음을 사용할 수 있습니다 :
n 일 후 :
def get_n_days_after_date(date_format="%d %B %Y", add_days=120):
date_n_days_after = datetime.datetime.now() + timedelta(days=add_days)
return date_n_days_after.strftime(date_format)
n 날짜 전 :
def get_n_days_before_date(self, date_format="%d %B %Y", days_before=120):
date_n_days_ago = datetime.datetime.now() - timedelta(days=days_before)
return date_n_days_ago.strftime(date_format)
ISO 8601 타임 스탬프 가져 오기
시간대없이 마이크로 초
from datetime import datetime
datetime.now().isoformat()
# Out: '2016-07-31T23:08:20.886783'
시간대와 함께, 마이크로 초
from datetime import datetime
from dateutil.tz import tzlocal
datetime.now(tzlocal()).isoformat()
# Out: '2016-07-31T23:09:43.535074-07:00'
마이크로 초가없는 시간대가있는 경우
from datetime import datetime
from dateutil.tz import tzlocal
datetime.now(tzlocal()).replace(microsecond=0).isoformat()
# Out: '2016-07-31T23:10:30-07:00'
ISO 8601 형식에 대한 자세한 내용은 ISO 8601 을 참조하십시오.