Jak przekonwertować ciąg w formacie "%d/%m/%Y"
na znacznik czasu?
"01/12/2011" -> 1322697600
Jak przekonwertować ciąg w formacie "%d/%m/%Y"
na znacznik czasu?
"01/12/2011" -> 1322697600
Odpowiedzi:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()
lub.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
jest nieco krótszy
.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.
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 .
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.date
do 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.
NameError: name 'wckCalendar' is not defined
. Używam Python 3.4.1 na maszynie z systemem Windows 32 bity. Dowolny pomysł? Dzięki.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
nie jest obsługiwany przez Python . To nie jest przenośne.
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
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()
float
nieint
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 pytz
do tzinfo
w datetime.datetime
pracy 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
Sugerowałbym dateutil :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"
formacie. Porównaj: dateutil.parser.parse("01/02/2001")
idatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
chyba że twoją lokalną strefą czasową jest UTC. Zobacz mój komentarz od 2014
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)
datetime
funkcja datetime
z datetime
biblioteki nie obsługuje.timestamp()
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
Możesz skorzystać z tego linku, aby użyć strptime
funkcji z datetime.datetime
, aby przekonwertować datę z dowolnego formatu wraz ze strefą czasową.
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
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()
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