파이썬에서 문자열 날짜를 타임 스탬프로 변환


219

형식의 문자열 "%d/%m/%Y"을 타임 스탬프 로 변환하는 방법은 무엇입니까?

"01/12/2011" -> 1322697600

두 번째 숫자는 무엇입니까? 유닉스 시대?
Hasteur

4
@Hasteur, 그렇습니다. 두 번째 숫자는 유닉스 시대의 시작과 지정된 날짜 사이에 경과 된 시간 (초)을 나타냅니다. 이 형식은 POSIX 시간이라고도합니다.
eikonomega

답변:


317
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
현지 시간대로 2011 년 1 월 12 일 자정을 가정합니다. 입력이 UTC 인 경우; 당신은 사용할 수 있습니다 calendar.timegm()또는.toordinal()
JFS

50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()조금 짧습니다
timdiels

11
@timdiels : 다시. 명시적인 시간대가 지정되지 않은 경우 UTC 대신 현지 시간을 .timestamp()가정합니다 . 답변의 코드는 로컬 시간대가 0 utc 오프셋이있는 컴퓨터에서만 작동합니다 (예상 생성 ). 1322697600
jfs

7
작동하지 않습니다 : datetime.datetime.strptime ( "2014 : 06 : 28 11:53:21", "% Y : % m : % d % H : % M : % S"). timestamp () Traceback ( 가장 최근의 마지막 호출) : <module>의 파일 "<stdin>", line 1, AttributeError : 'datetime.datetime'개체에 'timestamp'속성이 없습니다.
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp ()는 파이썬> = 3.3 버전에서만 사용할 수 있습니다. docs.python.org/3/whatsnew/3.3.html
joni jones

48

나는 ciso8601datetime의 strptime보다 62 배 빠른을 사용 합니다.

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

자세한 내용은 여기를 참조 하십시오 .


2
이것은 환상적인 제안입니다. 방금 그것을 사용하고 실행 시간을 크게 줄였습니다.
David

3
나의 신 이것은 빠르다
Hews

3
그리고 시간 문자열 형식이 무엇인지 철자 할 필요가 없기 때문에 +1입니다.
gowenfawr

40

문자열을 날짜 객체로 변환하려면

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

날짜 개체를 POSIX 타임 스탬프로 변환하는 방법은 시간대에 따라 다릅니다. 에서 변환 datetime.date파이썬에서 UTC 타임 스탬프에 :

  • 날짜 객체는 UTC 자정을 나타냅니다

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • 날짜 개체는 현지 시간으로 자정을 나타냅니다

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

UTC와 현지 시간 자정이 같은 경우가 아니면 타임 스탬프가 다릅니다.


이 게시물의 예제를 실행하면 오류가 발생 NameError: name 'wckCalendar' is not defined합니다. Windows 32 비트 시스템에서 Python 3.4.1을 실행 중입니다. 어떤 생각? 감사.
sedeh 1

1
@ sedeh 게시물에 wckCalendar가 없습니다. 코드를 확인하십시오.
jfs

@JFSebastian 정확히, 나는 wckCalendar를 직접 호출하려고하지 않았습니다. 오류 메시지에 나타납니다. 문제를 논의하는 여기 내 게시물을 참조하십시오 .
sedeh

1
@ törzsmókus : 대답이 틀리면 읽기 쉬운 정도는 중요하지 않습니다.
jfs

1
@ törzsmókus : 내 대답을보십시오 : 두 개의 다른 숫자 가 생성 될 수 있습니다 . 답은 어느 것을 언급하지 않고 하나의 숫자를 생성합니다 .
jfs


21

답변은 입력 날짜 시간대에 따라 다릅니다. 날짜가 현지 날짜 인 경우 katrielalex가 말한 것처럼 mktime ()을 사용할 수 있습니다.이 짧은 버전 대신 datetime을 사용한 이유는 모르겠습니다.

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

그러나 아마도 다른 TZ에있을 때 내 결과와 다른 결과를 관찰하십시오 (결과는 시간대가없는 UNIX 타임 스탬프입니다)

입력 날짜가 이미 UTC 인 경우 올바른 해결책은 다음과 같습니다.

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

나는 이것이 더 낫다고 생각한다. 'time'과 'datetime'을 모두 가져올 필요가 없습니다.
kennyut

17

간단히 사용하십시오 datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

결과:

1322697600

현지 시간대 대신 UTC를 사용하려면 다음을 사용하십시오 .replace.

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

완전한 답변을 위해서는 파이썬 3.3 이상에서만 유효하다고 말해야합니다.
Eduardo

첫 번째 예에서 결과는 float그렇지 않습니다.int
CONvid19

6

먼저 문자열을 struct_time 형식으로 변환 하려면 strptime 클래스가 있어야 합니다.

그런 다음 mktime 을 사용 하여 플로트를 얻으십시오.


6

이 많은 답변은 날짜가 처음부터 순진하다는 것을 고려하지 않습니다.

올바르게하려면 순진한 날짜를 시간대를 인식하는 날짜 / 시간으로 만들어야합니다.

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

또한:

사용주의 pytz에 대한 tzinfoA의 datetime.datetime많은 시간대에 대한하지 않습니다 작동합니다. pytz 시간대가있는 datetime을 참조하십시오 . tzinfo 설정 방법에 따라 다른 오프셋

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://ko.wikipedia.org/wiki/Local_mean_time


6

나는 dateutil 을 제안 할 것이다 :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

그건 잘못 됐어. OP는 "%d/%m/%Y"형식 시간이 필요 합니다. 비교 : dateutil.parser.parse("01/02/2001")datetime.strptime("01/02/2001", "%d/%m/%Y")
JFS

@jfs에게 감사드립니다. 이에 따라 답변을 업데이트했습니다. (미국인이 아니기 때문에 비논리적 M / D / Y 형식이 파서의 기본값이라고 생각하지 않았을 것입니다.)
törzsmókus

1
1322697600현지 시간대가 UTC가 아닌 한 예상치를 생성하지 않습니다 . 2014에서 내 의견
jfs

4

매우 효율적인 것 같습니다 :

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

루프 당 1.61 µs ± 120ns (평균 7 번의 런, 평균 100000 루프)


datetime기능 은 무엇입니까 ? 라이브러리 datetime에서 datetime지원하지 않습니다.timestamp()
Joooeey

@Joooeey : Python 3.3 이상에서 수행됩니다 . 질문을 게시 할 때 사용할 수
없었지만

0

datetime.timestamp (datetime instanse)를 사용하면 datetime 인스턴스에 시간대 정보가 포함되므로 타임 스탬프는 표준 utc 타임 스탬프가됩니다. datetime을 timetuple로 변환하면 시간대가 없어 지므로 결과가 오류가됩니다. 인터페이스를 제공하려면 다음과 같이 작성해야합니다. int (datetime.timestamp (time_instance)) * 1000



0

isoformat으로 변환 할 수 있습니다

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

UNIX Epoch 시간을 얻는 간단한 기능.

참고 :이 기능은 입력 날짜 시간이 UTC 형식이라고 가정합니다 ( 여기의 설명 참조).

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

사용법 :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.