Преобразовать время в EpochSecond

Я новичок в питоне. В настоящее время у меня есть такие временные данные, как «2018-11-15 13: 34: 40.000 EST». Я хочу преобразовать его в EpochSecond.

Я знаю, как использовать dateparser, чтобы получить это, однако я хочу знать, есть ли простой способ сделать это без dateparser?

import dateparser
from datetime import datetime, timezone

mytime = "2018-11-15 13:34:40.000 EST"

dateVar = dateparser.parse(mytime)

print(dateVar)

epoch = datetime(1970, 1, 1,  tzinfo=timezone.utc)

print((dateVar - epoch).total_seconds()) 
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
590
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытаться:

from datetime import datetime

epoch = datetime.datetime(1970,1,1)
i = datetime.now()

delta_time = (i - epoch).total_seconds()
Ответ принят как подходящий

datetime.datetime.timestamp() - это то, что вы ищете (соответствующая часть):

For aware datetime instances, the return value is computed as:

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

Пример:

import datetime

now = datetime.datetime.now()
epoch = now.timestamp()

# 1542394106.155199

Реализовано в вашем примере, нам придется использовать другой подход, поскольку datetime.datetime.strptime() не совсем учитывает часовой пояс из-за ошибки (соответствующий вопрос, где я нашел информацию). Поэтому нам придется использовать другую встроенную программу для его анализа (пример здесь):

from dateutil.parser import parse

mytime = "2018-11-12 00:30:20.000 EST"
dt = parse(mytime)
epoch = dt.timestamp()

Анализируемая строка по-прежнему является объектом datetime.datetime, поэтому вы можете обрабатывать ее так же после синтаксического анализа.

Примечание: однако parse может жаловаться, что читает часовой пояс, но не понимает его:

 UnknownTimezoneWarning: tzname EDT identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.

В любом случае вам может понадобиться передать tzinfos в метод parse():

from dateutil.parser import parse
# from dateutil.tz import gettz # <-- can use if you know the tz to retrieve

tzinfos = {'EST': -18000, 'CET': +3600}
# another example: {"CST": gettz("America/Chicago")}
mytime = "2018-11-12 00:30:20.000 EST"
dt = parse(mytime, tzinfos=tzinfos)
epoch = dt.timestamp()
print(epoch)

Думаю, в конце концов, это не так просто, как вам хотелось бы.

Привет, Идель, не могли бы вы подробнее объяснить, как это использовать? например, мое время: «2018-11-12 00: 30: 20.000 EST»

Amen King 16.11.2018 20:00

Конечно, сначала вам нужно будет преобразовать вашу строку в объект datetime. Если вы не знаете конкретный формат или не знаете, как его преобразовать, можно использовать dateparser. Если формат согласован, вы можете просто использовать метод .strptime() из модуля datetime и сначала преобразовать строку, тогда преобразовать во время эпохи.

r.ook 16.11.2018 20:03

Обратите внимание, что в вашем примере с часовым поясом 'EST' это становится немного более проблематичным, поскольку есть ошибка в strptime() для обработки некоторого часового пояса. Если dateparser уже работает на вас, почему бы вместо этого не положиться на него? в противном случае вам придется вручную проанализировать часовой пояс и передать его в сам объект datetime.

r.ook 16.11.2018 20:10

Вы правы, потому что я не могу установить модуль на машину своей компании. Поэтому я пытаюсь проверить, смогу ли я проанализировать данные вручную.

Amen King 16.11.2018 20:14

@AmenKing Хорошо, я нашел другой способ сделать это с другим встроенным. См. Мой отредактированный ответ.

r.ook 16.11.2018 20:23

@idlehands dateutil не является встроенным; это то, что вы установили. В этом примере нет WFM, он не работает с ImportError. (просто re: ваш отредактированный ответ, похоже, что у спрашивающего заработал код)

AdamKG 16.11.2018 20:28

@AdamKG, кажется, встроен в более позднюю версию. Прекрасно работает на repl.it без внешнего импорта.

r.ook 16.11.2018 20:30

@AmenKing Просто хочу отметить, что для часового пояса синтаксический анализ может вызвать Warning, поскольку часовой пояс можно определить, но не понять, что означает, что данные передаются неправильно. Возможно, вам потребуется добавить аргумент tzinfos в parse(), см. Мои правки и дополнительные ссылки.

r.ook 16.11.2018 20:38

@idlehands Значит, в его среде установлено что-то repl.it; он сообщает, что это версия 3.6.1, моя - 3.6.6, и у меня ее нет, и просто чтобы убедиться, что я проверил источник :)

AdamKG 18.11.2018 04:00

Хм, я полагаю, ты прав. Кажется, это требуется для pandas, и поэтому он появился во всех трех моих средах (у меня нет установленного чистого). Я удивлен, ответ. Хотя бы он был, я бы предположил, что по умолчанию это ванильная версия.

r.ook 18.11.2018 04:30

Другие вопросы по теме