Come convertire una stringa nel formato "%d/%m/%Y"
in timestamp?
"01/12/2011" -> 1322697600
Come convertire una stringa nel formato "%d/%m/%Y"
in timestamp?
"01/12/2011" -> 1322697600
Risposte:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()
o.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
è un po 'più breve
.timestamp()
presuppone l' ora locale invece dell'UTC se non viene fornito un fuso orario esplicito. Il codice nella risposta funziona (produce atteso 1322697600
) solo su un computer in cui il fuso orario locale ha offset utc zero.
Io uso ciso8601
, che è 62 volte più veloce dello strptime di datetime.
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Puoi saperne di più qui .
Per convertire la stringa in un oggetto data:
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()
Il modo per convertire l'oggetto data in timestamp POSIX dipende dal fuso orario. Dalla conversione datetime.date
al timestamp UTC in Python :
L'oggetto data rappresenta la mezzanotte in UTC
import calendar
timestamp1 = calendar.timegm(utc_date.timetuple())
timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
assert timestamp1 == timestamp2
L'oggetto data rappresenta la mezzanotte nell'ora locale
import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
I timestamp sono diversi a meno che la mezzanotte in UTC e l'ora locale non siano la stessa istanza temporale.
NameError: name 'wckCalendar' is not defined
. Sto eseguendo Python 3.4.1 su una macchina Windows a 32 bit. Qualche idea? Grazie.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
non è supportato da Python . Non è portatile.
La risposta dipende anche dal fuso orario della data di input. Se la tua data è una data locale, puoi usare mktime () come ha detto katrielalex - solo che non vedo perché ha usato datetime invece di questa versione più breve:
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Ma osserva che il mio risultato è diverso dal suo, poiché probabilmente sono in una TZ diversa (e il risultato è un timestamp UNIX senza fuso orario)
Ora, se la data di input è già in UTC, credo che la soluzione giusta sia:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Usa semplicemente datetime.datetime.strptime
:
import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Risultato:
1322697600
Per utilizzare UTC invece del fuso orario locale, utilizza .replace
:
datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
float
nonint
Molte di queste risposte non si preoccupano di considerare che la data è ingenua per cominciare
Per essere corretti, devi prima rendere la data ingenua un datetime che riconosce il fuso orario
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
Anche:
Fai attenzione, l'uso di pytz
for tzinfo
in a datetime.datetime
NON FUNZIONA per molti fusi orari. Vedi datetime con fuso orario pytz. Offset diverso a seconda di come è impostato 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
Suggerirei dateutil :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"
formato. Confronta: dateutil.parser.parse("01/02/2001")
edatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
meno che il fuso orario locale non sia UTC. Vedi il mio commento del 2014
Sembra essere abbastanza efficiente:
import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 µs ± 120 ns per loop (media ± dev. Std. Di 7 analisi, 100000 loop ciascuna)
datetime
funzione? datetime
dalla datetime
libreria non supporta.timestamp()
puoi convertire in isoformat
my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()
basta usare datetime.timestamp (la tua istanza datetime), l'istanza datetime contiene le informazioni sul fuso orario, quindi il timestamp sarà un timestamp utc standard. se si trasforma la data e l'ora in timesuple, perderà il fuso orario, quindi il risultato sarà un errore. se vuoi fornire un'interfaccia, dovresti scrivere in questo modo: int (datetime.timestamp (time_instance)) * 1000
È possibile fare riferimento a questo collegamento seguente per utilizzare la strptime
funzione da datetime.datetime
, per convertire la data da qualsiasi formato insieme al fuso orario.
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
Una semplice funzione per ottenere l'ora di UNIX Epoch.
NOTA : questa funzione presuppone che l'ora della data di input sia in formato UTC (fare riferimento ai commenti qui).
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())
Utilizzo :
>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600