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.dateal 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()
floatnonint
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 pytzfor tzinfoin a datetime.datetimeNON 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")
1322697600meno 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)
datetimefunzione? datetimedalla datetimelibreria 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 strptimefunzione 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