Подтвердить что ты не робот

Преобразование даты строки в метку времени в Python

Как преобразовать строку в формате "%d/%m/%Y" в метку времени?

"01/12/2011" -> 1322697600
4b9b3361

Ответ 1

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

Ответ 2

Чтобы преобразовать строку в объект даты:

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 в Python:

  • объект даты представляет собой полночь в 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, а по местному времени - один и тот же экземпляр времени.

Ответ 3

Я использую ciso8601, который в 62 раза быстрее, чем datetime strptime.

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

Вы можете узнать больше здесь.

Ответ 4

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

Ответ 5

Ответ зависит также от вашего часового пояса даты ввода. Если ваша дата является локальной датой, вы можете использовать mktime(), как сказал katrielalex, - только я не понимаю, почему он использовал дату и время вместо этой более короткой версии:

>>> 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

Ответ 6

Просто используйте 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()

Ответ 7

Сначала вы должны strptime класс преобразовать строку в формат struct_time.

Затем просто используйте mktime, чтобы получить свой поплавок.

Ответ 8

Я бы предложил dateutil:

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

Ответ 9

Многие из этих ответов не удосуживаются считать, что дата наивна с самого начала

Чтобы быть точным, вам нужно сначала сделать наивную дату осведомленной о часовом поясе datetime

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

также:

Будьте осторожны, использование pytz для tzinfo в datetime.datetime НЕ РАБОТАЕТ для многих часовых поясов. Смотрите datetime с часовым поясом pytz. Различное смещение в зависимости от того, как установлена tzinfo

# 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

Ответ 10

просто используйте datetime.timestamp(ваш datetime instanse), экземпляр datetime содержит информацию о часовом поясе, поэтому timestamp будет стандартной меткой времени utc. если вы преобразуете дату-время в timetuple, он потеряет часовой пояс, поэтому результат будет ошибкой. если вы хотите предоставить интерфейс, вы должны написать вот так:  int (datetime.timestamp(time_instance)) * 1000

Ответ 11

Кажется довольно эффективным:

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

1,61 мкс ± 120 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов в каждом)

Ответ 13

Простая функция для получения utctime.

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