web-dev-qa-db-fra.com

Convertir la date de la chaîne en horodatage dans Python

Comment convertir une chaîne au format "%d/%m/%Y" en horodatage?

"01/12/2011" -> 1322697600
186
Shankar Cabus
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0
271
Katriel

Pour convertir la chaîne en 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()

Le moyen de convertir l'objet de date en horodatage POSIX dépend du fuseau horaire. De Conversion de datetime.date en timestamp 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 en 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 est l'heure UTC et l'heure locale correspond à la même instance horaire.

37
jfs

J'utilise ciso8601, qui est 62 fois plus rapide que strptime de datetime.

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

Vous pouvez en apprendre plus ici .

35
Eyal Ch
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200
28
San4ez

La réponse dépend également de votre fuseau horaire de la date saisie. Si votre date est une date locale, alors vous pouvez utiliser mktime () comme katrielalex a dit - seulement je ne vois pas pourquoi il a utilisé datetime à la place de cette version plus courte:

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

Mais remarquez que mon résultat est différent du sien, car je suis probablement dans une TZ différente (et le résultat est un timestamp UNIX sans timezone)

Maintenant, si la date d'entrée est déjà en UTC, alors je pense que la bonne solution est:

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

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 le temps UTC au lieu du fuseau horaire local, utilisez .replace:

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

Tout d'abord, vous devez utiliser la classe strptime pour convertir la chaîne au format struct_time.

Ensuite, utilisez simplement mktime à partir de là pour obtenir votre float.

6
Cryptite

Je suggérerais dateutil :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()
6
törzsmókus

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 un fuseau horaire prenant en compte le 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 pour tzinfo dans un datetime.datetime NE FONCTIONNE PAS pour plusieurs fuseaux horaires. Voir date/heure avec le fuseau horaire pytz. Décalage différent en fonction de 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

https://en.wikipedia.org/wiki/Local_mean_time

5
MrE

Semble être 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 passages, 100 000 boucles chacun)

0
Gerard

utilisez simplement datetime.timestamp (votre instance de datetime), instance de datetime contenant les informations de fuseau horaire, de sorte que l'horodatage sera un horodatage utc standard. Si vous transformez la date et heure en heure, il perdra son fuseau horaire et le résultat sera une erreur. si vous voulez fournir une interface, vous devriez écrire comme ceci: int (datetime.timestamp (time_instance)) * 1000

0
user6689187

Vous pouvez vous référer au lien suivant pour utiliser la fonction strptime de datetime.datetime, afin de convertir une date à partir de n’importe quel format, ainsi que le fuseau horaire.

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

0
Arjun Sankarlal