В Python, как вы конвертируете объект `datetime` в секунды? - PullRequest
195 голосов
/ 21 октября 2011

Извиняюсь за простой вопрос ... Я новичок в Python ... Я искал вокруг, и, похоже, ничего не работает.

У меня есть куча объектов datetime, и я хочу рассчитать количество секунд с фиксированного времени в прошлом для каждого (например, с 1 января 1970 г.).

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

Кажется, это только различие между датами с разными днями:

t.toordinal()

Любая помощь очень ценится.

Ответы [ 8 ]

205 голосов
/ 21 октября 2011

Для особой даты 1 января 1970 года существует несколько опций.

Для любой другой начальной даты вам нужно получить разницу между двумя датами в секундах.Вычитание двух дат дает объект timedelta, который с Python 2.7 имеет функцию total_seconds().

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

Начальная дата обычно указывается в UTC, поэтому для правильных результатов datetime, который вы вводитев этой формуле должно быть также в UTC.Если ваш datetime еще не в UTC, вам необходимо преобразовать его перед использованием или прикрепить класс tzinfo, который имеет правильное смещение.

Как отмечено в комментариях, еслиу вас есть tzinfo, прикрепленный к вашему datetime, тогда он вам понадобится и на начальную дату, иначе вычитание не удастся;для приведенного выше примера я бы добавил tzinfo=pytz.utc при использовании Python 2 или tzinfo=timezone.utc при использовании Python 3.

125 голосов
/ 21 октября 2011

Чтобы получить время Unix (в секундах с 1 января 1970 года):

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
88 голосов
/ 10 мая 2015

Начиная с Python 3.3, это становится очень просто с помощью метода datetime.timestamp(). Это, конечно, будет полезно, только если вам нужно количество секунд с 1970-01-01 UTC.

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

Возвращаемым значением будет число с плавающей точкой, представляющее четные доли секунды. Если datetime является часовым поясом наивным (как в примере выше), предполагается, что объект datetime представляет местное время, т.е. это будет количество секунд от текущего времени в вашем местоположении до 1970-01-01 UTC.

25 голосов
/ 04 марта 2014

int (t.strftime("%s")) тоже работает

22 голосов
/ 28 февраля 2015

Может быть не по теме: получить UNIX / POSIX время от datetime и преобразовать его обратно:

>>> 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 вашего текущего часового пояса. В этом примере это + 1 час, то есть UTC + 0100.

Ссылки:

12 голосов
/ 21 октября 2011

из документации по питону:

timedelta.total_seconds()

Возвращает общее количество секунд, содержащихся в продолжительности.Эквивалентно

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

, рассчитанному с включенным истинным делением.

Обратите внимание, что для очень больших временных интервалов (более 270 лет на большинстве платформ) этот метод теряет микросекундную точность.

Эта функциональность является новой в версии 2.7.

2 голосов
/ 25 августа 2015

Чтобы преобразовать объект даты и времени, который представляет время в 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()

См. Как преобразовать местное время в UTC в Python? Если база данных tz доступна на данной платформе; может работать только решение stdlib .

Перейдите по ссылкам, если вам нужны решения для <3.3 версий Python.

1 голос
/ 09 мая 2015

Я попробовал стандартную библиотеку calendar.timegm , и она работает довольно хорошо:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

Ссылка: https://docs.python.org/2/library/calendar.html#calendar.timegm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...