Convertir la fecha de la cadena a la marca de tiempo en Python

¿Cómo convertir una cadena en el formato "%d/%m/%Y" a la marca de tiempo?

 "01/12/2011" -> 1322697600 

 >>> import time >>> import datetime >>> s = "01/12/2011" >>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) 1322697600.0 

Para convertir la cadena en un objeto de fecha:

 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 forma de convertir el objeto de fecha en la marca de hora POSIX depende de la zona horaria. De convertir datetime.date a la marca de tiempo UTC en Python :

  • fecha objeto representa la medianoche 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 
  • fecha objeto representa la medianoche en hora local

     import time timestamp3 = time.mktime(local_date.timetuple()) assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime()) 

Las marcas de tiempo son diferentes a menos que la medianoche en UTC y en hora local sea la misma instancia de tiempo.

Uso ciso8601 , que es 62 veces más rápido que el tiempo de ejecución de datetime.

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

Puedes aprender más aquí .

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

La respuesta también depende de la fecha y hora de entrada. Si su fecha es una fecha local, entonces puede usar mktime () como dijo katrielalex, solo que no veo por qué usó datetime en lugar de esta versión más corta:

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

Pero observe que mi resultado es diferente al suyo, ya que probablemente esté en una TZ diferente (y el resultado es una marca de tiempo de UNIX libre de zona horaria)

Ahora, si la fecha de entrada ya está en UTC, creo que la solución correcta es:

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

Simplemente use datetime.datetime.strptime :

 import datetime stime = "01/12/2011" print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp()) 

Resultado:

 1322697600 

Para usar UTC en lugar de la zona horaria local use .replace :

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

Primero debe la clase strptime para convertir la cadena a un formato struct_time.

Luego solo usa mktime desde allí para obtener tu flotador.

Yo sugeriría dateutil :

 import dateutil.parser dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp() 

Muchas de estas respuestas no se molestan en considerar que la fecha es ingenua para empezar

Para estar en lo correcto, primero debe hacer que la fecha ingenua se convierta en una fecha y hora.

 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=) # convert to UTC timezone utc = pytz.UTC d = d.astimezone(utc) >>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=) # 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=) # get the total second difference ts = (d - epoch).total_seconds() >>> 1322726400.0 

También:

Tenga cuidado, el uso de pytz para tzinfo en un datetime.datetime NO FUNCIONA para muchas zonas horarias. Ver datetime con la zona horaria de pytz. Diferente desplazamiento dependiendo de cómo se establece 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=) # 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=) # you end up with an offset 

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

solo use datetime.timestamp (su datetime instanse), la instancia de datetime contiene la información de la zona horaria, por lo que la marca de tiempo será una marca de tiempo utc estándar. Si transforma la fecha y hora en el calendario, perderá su zona horaria, por lo que el resultado será un error. Si desea proporcionar una interfaz, debe escribir así: int (datetime.timestamp (time_instance)) * 1000

Parece ser bastante eficiente:

 import datetime day, month, year = '01/12/2011'.split('/') datetime.datetime(int(year), int(month), int(day)).timestamp() 

1.61 µs ± 120 ns por bucle (media ± desviación estándar de 7 ejecuciones, 100000 bucles cada una)

Puede consultar este siguiente enlace para usar la función strptime de datetime.datetime , para convertir la fecha de cualquier formato junto con la zona horaria.

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