수색…


비고

Python은 날짜와 시간을 생성, 수정, 파싱 및 조작하기위한 내장 메소드와 외부 라이브러리를 제공합니다.

문자열을 시간대 인식 datetime 객체로 파싱하기

문자열datetime 객체로 구문 분석 할 때 Python 3.2 이상에서 %z 형식을 지원합니다.

+HHMM 또는 -HHMM (개체가 순진한 경우 빈 문자열) 형식의 UTC 오프셋입니다.

파이썬 3.x 3.2
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 하고 (선택 사항) 이름 매개 변수를 :

파이썬 3.x 3.2
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 은 초 단위로 지정됩니다).

파이썬 3.x 3.2
Python 2.x 2.7
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 표준 라이브러리는 표준 클래스를 제공하지 않으므로 타사 라이브러리를 사용해야합니다. pytzdateutil 은 시간대 등급을 제공하는 인기있는 라이브러리입니다.

정적 표준 시간대 외에도 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 경우 정확히 어떤 형식인지 알아야합니다. 합병증으로 datetimedatetime 은 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

deltatimedelta 유형입니다.

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 을 참조하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow