Comment convertir une chaîne au format "%d/%m/%Y"
horodatage?
"01/12/2011" -> 1322697600
Comment convertir une chaîne au format "%d/%m/%Y"
horodatage?
"01/12/2011" -> 1322697600
Réponses:
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
calendar.timegm()
ou.toordinal()
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()
est un peu plus court
.timestamp()
suppose l' heure locale au lieu de l'UTC si aucun fuseau horaire explicite n'est donné. Le code dans la réponse ne fonctionne (produit attendu 1322697600
) que sur un ordinateur où le fuseau horaire local n'a aucun décalage utc.
J'utilise ciso8601
, ce qui est 62x plus rapide que le strptime de datetime.
t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())
Vous pouvez en savoir plus ici .
Pour convertir la chaîne en un objet date:
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()
La façon de convertir l'objet date en horodatage POSIX dépend du fuseau horaire. De la conversion datetime.date
en horodatage UTC en Python :
l'objet date représente minuit en 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'objet date représente minuit dans l'heure locale
import time
timestamp3 = time.mktime(local_date.timetuple())
assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())
Les horodatages sont différents sauf si minuit en UTC et en heure locale est la même instance de temps.
NameError: name 'wckCalendar' is not defined
. J'exécute Python 3.4.1 sur une machine Windows 32 bits. Une idée? Merci.
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
"%s"
n'est pas pris en charge par Python . Ce n'est pas portable.
La réponse dépend également de votre fuseau horaire de date d'entrée. Si votre date est une date locale, vous pouvez utiliser mktime () comme l'a dit katrielalex - seulement je ne vois pas pourquoi il a utilisé datetime au lieu de cette version plus courte:
>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0
Mais observez que mon résultat est différent du sien, car je suis probablement dans un TZ différent (et le résultat est un horodatage UNIX sans fuseau horaire)
Maintenant, si la date d'entrée est déjà en UTC, je pense que la bonne solution est:
>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600
Utilisez simplement datetime.datetime.strptime
:
import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())
Résultat:
1322697600
Pour utiliser UTC au lieu du fuseau horaire local, utilisez .replace
:
datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()
float
nonint
Beaucoup de ces réponses ne prennent pas la peine de considérer que la date est naïve pour commencer
Pour être correct, vous devez d'abord faire de la date naïve une date / heure sensible au fuseau horaire
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
Aussi:
Soyez prudent, utilisez pytz
for tzinfo
dans un datetime.datetime
NE FONCTIONNE PAS pour de nombreux fuseaux horaires. Voir datetime avec le fuseau horaire pytz. Offset différent selon la configuration de 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
Je suggérerais dateutil :
import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
"%d/%m/%Y"
format. Comparer: dateutil.parser.parse("01/02/2001")
etdatetime.strptime("01/02/2001", "%d/%m/%Y")
1322697600
sauf si votre fuseau horaire local est UTC. Voir mon commentaire de 2014
Semble assez efficace:
import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()
1,61 µs ± 120 ns par boucle (moyenne ± écart type de 7 pistes, 100000 boucles chacune)
datetime
fonction? datetime
de la datetime
bibliothèque ne prend pas en charge.timestamp()
utilisez simplement datetime.timestamp (votre instance de datetime), l'instance de datetime contient les informations de fuseau horaire, donc l'horodatage sera un horodatage utc standard. si vous transformez le datetime en horaire, il perdra son fuseau horaire, donc le résultat sera une erreur. si vous voulez fournir une interface, vous devez écrire comme ceci: int (datetime.timestamp (time_instance)) * 1000
Vous pouvez vous référer à ce lien suivant pour utiliser la strptime
fonction de datetime.datetime
, pour convertir la date de n'importe quel format avec le fuseau horaire.
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
vous pouvez convertir en 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()
Une fonction simple pour obtenir l'heure UNIX Epoch.
REMARQUE : Cette fonction suppose que la date et l'heure d'entrée sont au format UTC (reportez-vous aux commentaires ici).
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())
Utilisation :
>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600