В Python, как вы конвертируете объект "datetime" в несколько секунд?
Извинения за простой вопрос... Я новичок в Python... Я искал вокруг и ничего не работает.
У меня есть куча объектов datetime, и я хочу рассчитать количество секунд с фиксированного времени в прошлом для каждого из них (например, с 1 января 1970 года).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Это, по-видимому, только дифференцирование между датами, которые имеют разные дни:
t.toordinal()
Любая помощь очень ценится.
Ответы
Ответ 1
Для специальной даты с 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.
Ответ 2
Чтобы получить Unix-время (секунды с 1 января 1970 года):
>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
Ответ 3
Начиная с Python 3.3, это становится очень простым с помощью метода datetime.timestamp()
. Это, конечно, будет полезно, только если вам нужно количество секунд с 1970-01-01 UTC.
from datetime import datetime
dt = datetime.today() # Get timezone naive now
seconds = dt.timestamp()
Возвращаемое значение будет float, представляющим ровные доли секунды. Если время datetime является наивным наименованием часового пояса (как в примере выше), предполагается, что объект datetime представляет локальное время, т.е. Это будет количество секунд от текущего времени в вашем местоположении до 1970-01-01 UTC.
Ответ 4
int (t.strftime("%s"))
также работает
Ответ 5
Может быть, вне темы: чтобы получить время 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 текущего часового пояса. В этом примере это +1h, то есть UTC + 0100.
Рекомендации:
Ответ 6
из документов python:
timedelta.total_seconds()
Возвращает общее количество секунд, содержащихся в длительности. Эквивалентно
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
рассчитанный с включенным истинным делением.
Обратите внимание, что при очень больших временных интервалах (более 270 лет на большинстве платформ) этот метод потеряет точность в микросекундах.
Эта функциональность новая в версии 2.7.
Ответ 7
Чтобы преобразовать объект datetime, отображающий время в формате UTC в метку времени POSIX:
from datetime import timezone
seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()
Чтобы преобразовать объект datetime, который представляет время в локальном часовом поясе для метки времени 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.
Ответ 8
Я попробовал стандартную библиотеку 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