Перетворити дату рядка в мітку часу в Python


219

Як перетворити рядок у форматі "%d/%m/%Y"в часову позначку?

"01/12/2011" -> 1322697600

Що таке 2 число? Час Unix Epoch?
Хастера

4
@Hasteur, так. Друге число являє собою кількість секунд, що пройшли між початком епохи unix та вказаною датою. Цей формат також називають часом POSIX.
eikonomega

Відповіді:


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

10
він передбачає опівночі 12.12.2011 у місцевому часовому поясі. Якщо вхід у UTC; ви можете використовувати calendar.timegm()or.toordinal()
jfs

50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()трохи коротше
timdiels

11
@timdiels: знову. .timestamp()передбачає місцевий час замість UTC, якщо не вказано чіткого часового поясу. Код у відповіді працює (створює очікувані 1322697600) лише на комп’ютері, де місцевий часовий пояс має зсув нульового значення utc.
jfs

7
це не працює: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timetamp () Traceback () останній дзвінок останній): Файл "<stdin>", рядок 1, в <module> AttributeError: 'datetime.datetime "об’єкт не має атрибута' timetamp '
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp () доступний лише для версії python> = 3.3. docs.python.org/3/whatsnew/3.3.html
joni jones

48

Я використовую ciso8601, що на 62 рази швидше, ніж у стриптиз дати.

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

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


2
це фантастична пропозиція. я просто використав це і поголив ТОНС відключення мого страти.
Девід

3
Мій бог, це швидко
Хьюс

3
І +1 за те, що мені не потрібно роз'яснювати, що таке формат часового рядка.
gowenfawr

40

Щоб перетворити рядок в об’єкт дати:

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 та за місцевим часом - це той самий екземпляр часу.


Коли я запускаю приклади на цій посаді, я отримую помилку: NameError: name 'wckCalendar' is not defined. Я запускаю Python 3.4.1 на 32-бітній машині Windows. Будь-яка ідея? Дякую.
sedeh

1
@sedeh немає wckCalendar в пості. Перевір свій код.
jfs

@JFSebastian Точно, і я не намагався зателефонувати wckCalendar безпосередньо. Він просто відображається у повідомленні про помилку. Дивіться тут мій пост, який обговорює проблему.
sedeh

1
@ törzsmókus: Якщо відповідь неправильна, не має значення, наскільки вона читається.
jfs

1
@ törzsmókus: поглянь на мою відповідь: це може дати два різні числа. Ваша відповідь дає одне число, не згадуючи, яке.
jfs


21

Відповідь також залежить від часового поясу дати введення. Якщо ваша дата є місцевою датою, ви можете використовувати mktime (), як сказав katrielalex - тільки я не бачу, чому він використав datetime замість цієї коротшої версії:

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

Я думаю, що це краще. Не потрібно імпортувати і "time", і "timetime".
kennyut

17

Просто використовуйте 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()

Для повного прихильника потрібно сказати, що він дійсний лише для python 3.3+
Eduardo

На першому прикладі результат floatнеint
CONvid19

6

Спочатку ви повинні клас strptime, щоб перетворити рядок у формат struct_time.

Тоді просто використовуйте mktime звідти, щоб отримати свій поплавок.


6

Дуже багато з цих відповідей не заважають вважати, що дата починається наївно

Для коректності вам потрібно спочатку зробити наївну дату часовим поясом

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роботи не для багатьох часових поясів. Дивіться дату з часовим поясом pytz. Різне зміщення залежно від способу встановлення цинфо

# 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


6

Я б запропонував дати :

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

Це неправильно. ОП очікує часу у "%d/%m/%Y"форматі. Порівняйте: dateutil.parser.parse("01/02/2001")іdatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

дякую @jfs, хороший улов. Я відповідно оновив свою відповідь. (як неамериканський, я б не вважав, що нелогічний формат M / D / Y є типовим для аналізатора.)
törzsmókus

1
це не дає очікуваного, 1322697600якщо ваш місцевий часовий пояс не є UTC. Дивіться мій коментар з 2014 року
jfs

4

Здається, це досить ефективно:

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

1,61 мкс ± 120 нс на цикл (середнє ± ст. Розм. 7 пробігів, 100000 петель у кожному)


Яка datetimeфункція? datetimeз datetimeбібліотеки не підтримує.timestamp()
Joooeey

@Joooeey: Це на Python 3.3 або пізнішої версії . Не було доступно, коли питання було розміщено, але воно було доступне з вересня 2012 року.
ShadowRanger

0

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



0

ви можете конвертувати в ізоформат

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

Проста функція, щоб отримати час UNIX Epoch.

ПРИМІТКА . Ця функція передбачає, що час дати введення в форматі UTC (див. Тут коментарі ).

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

Використання :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.