Programing

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

lottogame 2020. 5. 14. 07:56
반응형

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


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

"01/12/2011" -> 1322697600

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

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

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와 현지 시간 자정이 같은 경우가 아니라면 타임 스탬프가 다릅니다.


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

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

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


>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200

답변은 입력 날짜 시간대에 따라 다릅니다. 날짜가 현지 날짜 인 경우 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

간단히 사용하십시오 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()

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

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


나는 dateutil 을 제안 할 것이다 :

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

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

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

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

또한:

Be careful, using pytz for tzinfo in a datetime.datetime DOESN'T WORK for many timezones. See datetime with pytz timezone. Different offset depending on how tzinfo is set

# 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://en.wikipedia.org/wiki/Local_mean_time


just use datetime.timestamp(your datetime instanse), datetime instance contains the timezone infomation, so the timestamp will be a standard utc timestamp. if you transform the datetime to timetuple, it will lose it's timezone, so the result will be error. if you want to provide an interface, you should write like this: int(datetime.timestamp(time_instance)) * 1000


Seems to be quite efficient:

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

1.61 µs ± 120 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


You can refer this following link for using strptime function from datetime.datetime, to convert date from any format along with time zone.

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior


Simple function to get utctime.

   def utctime(ts=None):
        import datetime, calendar
        ts = datetime.datetime.utcnow() if ts is None else ts
        return calendar.timegm(ts.utctimetuple())

참고URL : https://stackoverflow.com/questions/9637838/convert-string-date-to-timestamp-in-python

반응형