파이썬에서`datetime` 객체를 초로 어떻게 변환합니까?


226

간단한 질문에 대한 사과 ... 나는 파이썬에 익숙하지 않다 ... 나는 주변을 탐색했지만 아무것도 작동하지 않는 것 같다.

datetime 객체가 많이 있고 각 시간에 대해 고정 시간 이후의 초 수를 계산하려고합니다 (예 : 1970 년 1 월 1 일 이후).

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

이것은 다른 날을 가진 날짜 사이에서만 차별화되는 것으로 보입니다.

t.toordinal()

도움을 주시면 감사하겠습니다.



2
아마 에포크 이후로 둘 다 S로 변환하고 거기에서 갈 것입니다 : int(t.timestamp())
nerdwaller

반대 작업을 위해 여기
Trevor Boyd Smith

답변:


233

1970 년 1 월 1 일의 특별 날짜에는 여러 가지 옵션이 있습니다.

다른 시작 날짜의 경우 두 날짜 간의 차이를 초 단위로 가져와야합니다. 두 날짜를 빼면 timedelta파이썬 2.7부터 total_seconds()함수 가있는 객체가 생깁니다 .

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

시작 날짜는 일반적으로 UTC로 지정되므로 적절한 결과를 얻으려면 datetime이 수식에 피드를 입력해야합니다. datetimeUTC가 아닌 경우 사용하기 전에 변환하거나 tzinfo적절한 오프셋이 있는 클래스를 연결해야합니다 .

의견에서 언급했듯이, tzinfo첨부 파일이 있으면 datetime시작 날짜에 하나가 필요합니다. 그렇지 않으면 빼기가 실패합니다. 위의 예에서는 tzinfo=pytz.utcPython 2를 사용하거나 tzinfo=timezone.utcPython 3을 사용하는 경우 추가 합니다 .


1
파이썬은 이제 경고합니다 : "TypeError : 오프셋 순진 및 오프셋 인식 날짜 시간을 뺄 수 없습니다"이를 해결하는 가장 좋은 솔루션은 무엇입니까?
Aaron Ash

2
@Charybdis, 시도하십시오 datetime.datetime(1970,1,1,tzinfo=pytz.utc).
Mark Ransom

9
사용을 고려하십시오 : datetime.datetime.utcfromtimestamp(0) 나는 이것을 '에포크'를 쉽게 얻기 위해 사용했습니다. 신기원이 모든 시스템에서 항상 동일하지는 않습니다.
DA

3
여기 시간대에 매우주의하십시오. I는 출력되는 것을 의미, UTC + 2에있어 time.time()그리고 datetime.now() - datetime(1970, 1, 1)7,200초 차이. 오히려 사용하십시오 (t - datetime.datetime.fromtimestamp(0)).total_seconds(). 하다 하지 사용 utcfromtimestamp(0)로컬 시간대의 날짜를 변환 할 경우.
Carl

2
@DA : 파이썬은 비 POSIX 시대를 지원하지 않습니다 . 파이썬이 작동하는 모든 시스템은 동일한 Epoch를 사용합니다. 1970-01-01 00:00:00 UTC
jfs

130

유닉스 시간을 얻으려면 (1970 년 1 월 1 일 이후의 초) :

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

22
현지 시간 그것의 표현에 대한 time.mktime을 사용할 때주의해야하고 그것이 플랫폼 의존의
의 Shih-원 총리 스와

7
실제로 조심하십시오. 그것은 내 엉덩이 큰 시간에 나를 물었다
Arg

t현지 시간 이라고 가정합니다 . 로컬 시간대에 대한 UTC 오프셋은 과거와 다를 수 있으며 mktime()(C 라이브러리)가 주어진 플랫폼에서 과거 시간대 데이터에 액세스 할 수없는 경우 실패 할 수 있습니다 ( pytztz 데이터베이스에 액세스하는 이식 가능한 방법 임). 또한 DST 전환 중에 현지 시간이 모호 할 수 있습니다. 예를 들어 연속 날짜 / 시간 값이 로그 파일에서 증가해야한다는 것을 알고 있다면
jfs

1
이것을 1 초의 시간으로 사용할 때주의하십시오. time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())결과적으로 1564819506.0밀리 초가 자동으로 떨어지지 만 datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()(Andrzej Pronobis의 답변) 결과 1564819506.912는 예상 결과입니다.
Alex

128

파이썬 3.3부터는이 datetime.timestamp()방법으로 매우 쉬워집니다 . 이것은 물론 1970-01-01 UTC에서 초가 필요한 경우에만 유용합니다.

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

반환 값은 1 초의 분수를 나타내는 float가됩니다. 날짜 시간이 시간대 순진 (위의 예에서와 같이) 인 경우 날짜 시간 객체가 현지 시간을 나타내는 것으로 가정합니다. 즉, 현재 시간에서 현재 위치에서 1970-01-01 UTC까지의 시간 (초)이됩니다.


3
누가 이것을 하향 조정했는지, 이유를 설명해 주시겠습니까?
Andrzej Pronobis 2016 년

5
나는 downvote가 질문에 python-2.7 태그 때문이라고 가정합니다 (단지 추측 일뿐입니다).
jfs

3
이것은 정답이어야하며, 정답은 그에 따라 업데이트되어야합니다.
DreamFlasher

11
업그레이드 할 시간;)
DreamFlasher

다른 시작일로부터이 거리를 계산할 수 있습니까? (
1970

29

아마 주제에서 벗어난 것 : 날짜 시간에서 UNIX / POSIX 시간을 가져 와서 다시 변환하려면 다음을 수행하십시오.

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

다른 시간대는 결과에 영향을 미칩니다 (예 : 현재 TZ / DST 반품 :

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

따라서 UTC 버전의 함수를 사용하여 UTC로 정규화하는 것을 고려해야합니다.

노트 이전 결과는 UTC를 계산하는 데 사용할 수있는 현재 시간대의 오프셋 (offset)입니다. 이 예에서 이것은 + 1h, 즉 UTC + 0100입니다.

참고 문헌 :


mktime()실패 할 수 있습니다. 일반적으로 pytzPOSIX 타임 스탬프를 얻으려면 현지 시간을 utc로 변환 해야 합니다.
jfs

calendar.timegm ()은 time.mktime ()의 utc 버전 인 것 같습니다
frankster

27

int (t.strftime("%s")) 또한 작동


1
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)(OP에서 지정한대로) Python 2.7에서 작동합니다 . 그러나 실제로 % s가 최근에 추가 된 시간 형식인지 의심합니다.
dan3

1
@ dan3 : 잘못되었습니다. %s지원되지 않습니다 (일부 플랫폼에서는 작동 t할 수 있습니다. 사용하지 마십시오.
jfs

%s어디에도 문서화되어 있지 않습니다. 나는 그것을 실제 코드로 뿌렸고 이것이 무엇인지 궁금해하고 문서를 보았는데와 같은 것은 없다 %s. 몇 초 동안 큰 S 만 있습니다.
VStoykov

13

파이썬 문서에서 :

timedelta.total_seconds()

지속 시간에 포함 된 총 시간 (초)을 반환합니다. 에 해당

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

진정한 나누기가 활성화 된 상태에서 계산됩니다.

매우 큰 시간 간격 (대부분의 플랫폼에서 270 년 이상)의 경우이 방법은 마이크로 초 정확도를 잃습니다.

이 기능은 버전 2.7의 새로운 기능입니다.


1
계산에는 약간의 문제가 있습니다. 10 * 6 대신 10 6 이어야합니다 . td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 6) / 10 ** 6
sdu

@ sdu great catch-이중 별표가 내 대답에 있지만 stackoverflow가 그것을 소비하고 텍스트를 색 전히 수정하려고합니다.
Michael

2

UTC로 시간을 나타내는 날짜 / 시간 객체를 POSIX 타임 스탬프로 변환하려면 :

from datetime import timezone

seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

로컬 시간대의 시간을 나타내는 날짜 시간 오브젝트를 POSIX 시간 소인으로 변환하려면 다음을 수행하십시오.

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

Python에서 현지 시간을 UTC로 변환하는 방법을 참조하십시오 . 특정 플랫폼에서 tz 데이터베이스를 사용할 수있는 경우 stdlib 전용 솔루션이 작동 할 수 있습니다 .

<3.3Python 버전 용 솔루션이 필요한 경우 링크를 따르십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.