Я новичок в питоне. В настоящее время у меня есть такие временные данные, как «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())






Пытаться:
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)
Думаю, в конце концов, это не так просто, как вам хотелось бы.
Конечно, сначала вам нужно будет преобразовать вашу строку в объект datetime. Если вы не знаете конкретный формат или не знаете, как его преобразовать, можно использовать dateparser. Если формат согласован, вы можете просто использовать метод .strptime() из модуля datetime и сначала преобразовать строку, тогда преобразовать во время эпохи.
Обратите внимание, что в вашем примере с часовым поясом 'EST' это становится немного более проблематичным, поскольку есть ошибка в strptime() для обработки некоторого часового пояса. Если dateparser уже работает на вас, почему бы вместо этого не положиться на него? в противном случае вам придется вручную проанализировать часовой пояс и передать его в сам объект datetime.
Вы правы, потому что я не могу установить модуль на машину своей компании. Поэтому я пытаюсь проверить, смогу ли я проанализировать данные вручную.
@AmenKing Хорошо, я нашел другой способ сделать это с другим встроенным. См. Мой отредактированный ответ.
@idlehands dateutil не является встроенным; это то, что вы установили. В этом примере нет WFM, он не работает с ImportError. (просто re: ваш отредактированный ответ, похоже, что у спрашивающего заработал код)
@AdamKG, кажется, встроен в более позднюю версию. Прекрасно работает на repl.it без внешнего импорта.
@AmenKing Просто хочу отметить, что для часового пояса синтаксический анализ может вызвать Warning, поскольку часовой пояс можно определить, но не понять, что означает, что данные передаются неправильно. Возможно, вам потребуется добавить аргумент tzinfos в parse(), см. Мои правки и дополнительные ссылки.
@idlehands Значит, в его среде установлено что-то repl.it; он сообщает, что это версия 3.6.1, моя - 3.6.6, и у меня ее нет, и просто чтобы убедиться, что я проверил источник :)
Хм, я полагаю, ты прав. Кажется, это требуется для pandas, и поэтому он появился во всех трех моих средах (у меня нет установленного чистого). Я удивлен, ответ. Хотя бы он был, я бы предположил, что по умолчанию это ванильная версия.
Привет, Идель, не могли бы вы подробнее объяснить, как это использовать? например, мое время: «2018-11-12 00: 30: 20.000 EST»