En Python, ¿cómo convertir un objeto `datetime` en segundos?

Disculpas por la simple pregunta … Soy nuevo en Python … He buscado y nada parece estar funcionando.

Tengo un montón de objetos de fecha y hora y quiero calcular el número de segundos desde un tiempo fijo en el pasado para cada uno (por ejemplo, desde el 1 de enero de 1970).

import datetime t = datetime.datetime(2009, 10, 21, 0, 0) 

Esto parece ser solo una diferenciación entre fechas que tienen días diferentes:

 t.toordinal() 

Cualquier ayuda es muy apreciada.

Para la fecha especial del 1 de enero de 1970 hay múltiples opciones.

Para cualquier otra fecha de inicio, necesita obtener la diferencia entre las dos fechas en segundos. Al restar dos fechas se obtiene un objeto timedelta , que a partir de Python 2.7 tiene una función total_seconds() .

 >>> (t-datetime.datetime(1970,1,1)).total_seconds() 1256083200.0 

La fecha de inicio generalmente se especifica en UTC, por lo que para obtener los resultados correctos, la datetime y datetime que ingresa en esta fórmula también debe estar en UTC. Si su datetime no está en UTC, deberá convertirla antes de usarla o adjuntar una clase tzinfo que tenga el desplazamiento adecuado.

Como se señaló en los comentarios, si tiene un tzinfo adjunto a su datetime y datetime , también necesitará uno en la fecha de inicio o la resta fallará; para el ejemplo anterior, agregaría tzinfo=pytz.utc si usara Python 2 o tzinfo=timezone.utc si usara Python 3.

Para obtener el tiempo de Unix (segundos desde el 1 de enero de 1970):

 >>> import datetime, time >>> t = datetime.datetime(2011, 10, 21, 0, 0) >>> time.mktime(t.timetuple()) 1319148000.0 

A partir de Python 3.3, esto se vuelve muy fácil con el método datetime.timestamp() . Por supuesto, esto solo será útil si necesita la cantidad de segundos desde 1970-01-01 UTC.

 from datetime import datetime dt = datetime.today() # Get timezone naive now seconds = dt.timestamp() 

El valor de retorno será un valor flotante que representa fracciones pares de segundos. Si la fecha y hora es ingenua para la zona horaria (como en el ejemplo anterior), se supondrá que la fecha y el objeto representan la hora local, es decir, será el número de segundos desde la hora actual en su ubicación hasta 1970-01-01 UTC.

int (t.strftime("%s")) también funciona

Quizás fuera del tema: para obtener la hora de UNIX / POSIX de datetime y volver a convertirla:

 >>> import datetime, time >>> dt = datetime.datetime(2011, 10, 21, 0, 0) >>> s = time.mktime(dt.timetuple()) >>> s 1319148000.0 # and back >>> datetime.datetime.fromtimestamp(s) datetime.datetime(2011, 10, 21, 0, 0) 

Tenga en cuenta que las diferentes zonas horarias tienen un impacto en los resultados, por ejemplo, mis devoluciones actuales de TZ / DST:

 >>> time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple()) -3600 # -1h 

por lo tanto, se debe considerar la normalización a UTC mediante el uso de versiones UTC de las funciones.

Tenga en cuenta que el resultado anterior se puede usar para calcular el desplazamiento UTC de su zona horaria actual. En este ejemplo, esto es + 1h, es decir, UTC + 0100.

Referencias:

  • datetime.date.timetuple
  • time.mktime
  • datetime.datetime.fromtimestamp
  • La introducción en el módulo de tiempo explica el tiempo POSIX, época de 1970, UTC, TZ, DST …

de los documentos de python:

 timedelta.total_seconds() 

Devuelve el número total de segundos contenidos en la duración. Equivalente a

 (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 

computado con la división verdadera habilitada.

Tenga en cuenta que para intervalos de tiempo muy grandes (más de 270 años en la mayoría de las plataformas) este método perderá una precisión de microsegundos.

Esta funcionalidad es nueva en la versión 2.7.

Probé el calendario de la biblioteca estándar y funciona bastante bien:

 # convert a datetime to milliseconds since Epoch def datetime_to_utc_milliseconds(aDateTime): return int(calendar.timegm(aDateTime.timetuple())*1000) 

Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm

Para convertir un objeto de fecha y hora que represente el tiempo en UTC a la marca de tiempo POSIX :

 from datetime import timezone seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp() 

Para convertir un objeto de fecha y hora que representa el tiempo en la zona horaria local a la marca de tiempo POSIX:

 import tzlocal # $ pip install tzlocal local_timezone = tzlocal.get_localzone() seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp() 

Consulte ¿Cómo convierto la hora local a UTC en Python? Si la base de datos tz está disponible en una plataforma dada; puede funcionar una solución sólo estándar .

Siga los enlaces si necesita soluciones para <3.3 versiones de Python.