Konwertuj datę ciągu na znacznik czasu w Pythonie


219

Jak przekonwertować ciąg w formacie "%d/%m/%Y"na znacznik czasu?

"01/12/2011" -> 1322697600

Jaki jest drugi numer? Czas epoki uniksowej?
— Hasteur

4
@Hasteur, tak. Druga liczba reprezentuje liczbę sekund, które upłynęły między początkiem epoki uniksowej a określoną datą. Ten format jest również określany jako czas POSIX.
— eikonomega

Odpowiedzi:


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

10
zakłada północ 01.12.2011 w lokalnej strefie czasowej. Jeśli dane wejściowe są w UTC; możesz użyć calendar.timegm()lub.toordinal()
— jfs

50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()jest nieco krótszy
— timdiels

11
@timdiels: ponownie. .timestamp()zakłada czas lokalny zamiast UTC, jeśli nie podano wyraźnej strefy czasowej. Kod w odpowiedzi działa (tworzy oczekiwany 1322697600) tylko na komputerze, na którym lokalna strefa czasowa ma zerowe przesunięcie utc.
— jfs

7
to nie działa: datetime.datetime.strptime („2014: 06: 28 11:53:21”, „% Y:% m:% d% H:% M:% S”). timestamp () Traceback ( ostatnie wywołanie ostatnie): Plik „<stdin>”, wiersz 1, w <module> AttributeError: Obiekt „datetime.datetime” nie ma atrybutu „timestamp”
— Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp () dostępny tylko dla wersji python> = 3.3. docs.python.org/3/whatsnew/3.3.html
— joni jones

48

Używam ciso8601, co jest 62 razy szybsze niż czas datetime.

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

Możesz dowiedzieć się więcej tutaj .


2
to fantastyczna sugestia. właśnie go użyłem i ogoliłem MNÓSTWO czasu na egzekucję.
— David

3
Mój Boże, to jest szybkie
— Hews

3
I +1 za to, że nie potrzebuję przeliterować, jaki jest format ciągu czasu.
— gowenfawr

40

Aby przekonwertować ciąg na obiekt daty:

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

Sposób konwersji obiektu daty na znacznik czasu POSIX zależy od strefy czasowej. Od konwersji datetime.datedo znacznika czasu UTC w Pythonie :

  • Obiekt daty reprezentuje północ w UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
    
  • Obiekt daty reprezentuje północ w czasie lokalnym

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
    

Znaczniki czasu są różne, chyba że północ w UTC i czas lokalny to ta sama instancja czasu.


Kiedy uruchomić przykłady w tym poście, pojawia się błąd: NameError: name 'wckCalendar' is not defined. Używam Python 3.4.1 na maszynie z systemem Windows 32 bity. Dowolny pomysł? Dzięki.
— poniedziałek

1
@sedeh w poście nie ma wckCalendar. Sprawdź swój kod.
— jfs

@JFSebastian Dokładnie, a ja nie próbowałem zadzwonić bezpośrednio do wckCalendar. Po prostu pojawia się w komunikacie o błędzie. Zobacz mój post tutaj omawiający problem.
— poniedziałek

1
@ törzsmókus: Jeśli odpowiedź jest błędna, nie ma znaczenia, jak jest czytelna.
— jfs

1
@ törzsmókus: spójrz na moją odpowiedź: może dać dwie różne liczby. Twoja odpowiedź tworzy jeden numer, nie wspominając, który.
— jfs


21

Odpowiedź zależy również od strefy czasowej wejścia. Jeśli twoja data jest datą lokalną, możesz użyć mktime (), jak powiedział Katrielalex - tylko nie rozumiem, dlaczego użył datetime zamiast tej krótszej wersji:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

Ale zauważ, że mój wynik jest inny niż jego, ponieważ prawdopodobnie jestem w innym TZ (a wynikiem jest wolny od strefy czasowej znacznik czasu UNIX)

Teraz, jeśli data wejścia jest już w UTC, to uważam, że właściwym rozwiązaniem jest:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

Myślę, że tak jest lepiej. Nie ma potrzeby importowania zarówno „godziny”, jak i „daty i godziny”.
— kennyut

17

Po prostu użyj datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

Wynik:

1322697600

Aby użyć UTC zamiast lokalnej strefy czasowej .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

Aby uzyskać pełną odpowiedź, musisz powiedzieć, że jest ona ważna tylko dla Pythona 3.3+
— Eduardo

W pierwszym przykładzie wynikiem jest floatnieint
— CONVid19

6

Najpierw musisz klasę strptime, aby przekonwertować ciąg do formatu struct_time.

Następnie wystarczy użyć stamtąd mktime, aby uzyskać pływak.


6

Wiele z tych odpowiedzi nie przeszkadza, że ​​data jest naiwna na początek

Aby być poprawnym, musisz najpierw ustawić naiwną datę jako datę i strefę czasową

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

Również:

Bądź ostrożny, używając pytzdo tzinfow datetime.datetimepracy nie dla wielu stref czasowych. Zobacz datetime w strefie czasowej pytz. Różne przesunięcie w zależności od ustawienia 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


6

Sugerowałbym dateutil :

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

To jest złe. OP oczekuje czasu w "%d/%m/%Y"formacie. Porównaj: dateutil.parser.parse("01/02/2001")idatetime.strptime("01/02/2001", "%d/%m/%Y")
— jfs

dzięki @jfs, dobry połów. Zaktualizowałem odpowiednio swoją odpowiedź. (jako nie-Amerykanin nie
— sądziłbym,

1
nie daje oczekiwanego, 1322697600chyba że twoją lokalną strefą czasową jest UTC. Zobacz mój komentarz od 2014
— JFS

4

Wydaje się być dość wydajny:

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

1,61 µs ± 120 ns na pętlę (średnia ± odchylenie standardowe z 7 serii, każda 100000 pętli)


Jaka jest datetimefunkcja datetimez datetimebiblioteki nie obsługuje.timestamp()
— Joooeey

@Joooeey: Tak, w Pythonie 3.3 lub nowszym . Nie było dostępne, gdy pytanie zostało opublikowane, ale jest dostępne od września 2012 r.
— ShadowRanger

0

wystarczy użyć datetime.timestamp (instancja datetime), instancja datetime zawiera informację o strefie czasowej, więc znacznik czasu będzie standardowym znacznikiem czasu utc. jeśli przekształcisz datetime w harmonogram, straci strefę czasową, więc wynikiem będzie błąd. jeśli chcesz zapewnić interfejs, powinieneś napisać w ten sposób: int (datetime.timestamp (instancja_czasu)) * 1000



0

możesz przekonwertować na izoformat

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

Prosta funkcja pozwalająca uzyskać czas UNIX Epoki.

UWAGA : Ta funkcja zakłada, że ​​data i godzina wprowadzenia są w formacie UTC (patrz komentarze tutaj).

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

Zastosowanie :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.