Disculpas por la simple pregunta ... Soy nuevo en Python ... He buscado y parece que nada funciona.
Tengo un montón de objetos de fecha y hora y quiero calcular el número de segundos desde una hora fija 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 solo diferenciar entre fechas que tienen días diferentes:
t.toordinal()
Cualquier ayuda es muy apreciada.
python
python-2.7
Nathan Lippi
fuente
fuente
datetime.date
a marca de tiempo UTC en Pythonint(t.timestamp())
Respuestas:
Para la fecha especial del 1 de enero de 1970 hay varias opciones.
Para cualquier otra fecha de inicio, debe obtener la diferencia entre las dos fechas en segundos. Restar dos fechas da un
timedelta
objeto, que a partir de Python 2.7 tiene unatotal_seconds()
función.La fecha de inicio generalmente se especifica en UTC, por lo que para obtener los resultados correctos, también
datetime
debe incluirla en UTC. Si aúndatetime
no está en UTC, deberá convertirlo antes de usarlo o adjuntar unatzinfo
clase que tenga el desplazamiento adecuado.Como se señaló en los comentarios, si tiene un
tzinfo
adjunto a sudatetime
, también necesitará uno en la fecha de inicio o la resta fallará; para el ejemplo anterior, agregaríatzinfo=pytz.utc
si usa Python 2 otzinfo=timezone.utc
si usa Python 3.fuente
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
He usado esto para obtener la 'época' fácilmente. Tenga en cuenta que la época no siempre es la misma en todos los sistemas.time.time()
ydatetime.now() - datetime(1970, 1, 1)
difieren en 7200 segundos. Más bien uso(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. No lo useutcfromtimestamp(0)
si desea convertir una fecha y hora en su zona horaria local.Para obtener el tiempo de Unix (segundos desde el 1 de enero de 1970):
fuente
t
es una hora local. La compensación de UTC para la zona horaria local puede haber sido diferente en el pasado y simktime()
(biblioteca C) no tiene acceso a los datos históricos de la zona horaria en una plataforma determinada, entonces puede fallar (pytz
es una forma portátil de acceder a la base de datos tz). Además, la hora local puede ser ambigua, por ejemplo, durante las transiciones DST: necesita información adicional para desambiguar , por ejemplo, si sabe que los valores de fecha / hora consecutivos deberían aumentar en un archivo de registrotime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
da como resultado1564819506.0
, bajando silenciosamente los milisegundos, perodatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(respuesta de Andrzej Pronobis) da como resultado1564819506.912
el resultado esperado.A partir de Python 3.3, esto se vuelve súper fácil con el
datetime.timestamp()
método. Por supuesto, esto solo será útil si necesita la cantidad de segundos desde 1970-01-01 UTC.El valor de retorno será un flotante que representa fracciones pares de un segundo. Si la fecha y hora es ingenua en la zona horaria (como en el ejemplo anterior), se supondrá que el objeto de fecha y hora representa la hora local, es decir, será el número de segundos desde la hora actual en su ubicación hasta 1970-01-01 UTC.
fuente
Tal vez fuera del tema: para obtener el tiempo UNIX / POSIX de datetime y convertirlo de nuevo:
Tenga en cuenta que diferentes zonas horarias tienen un impacto en los resultados, por ejemplo, mis retornos actuales de TZ / DST:
por lo tanto, uno debería considerar la normalización a UTC mediante el uso de versiones UTC de las funciones.
Tenga en cuenta que el resultado anterior se puede utilizar para calcular el desplazamiento UTC de su zona horaria actual. En este ejemplo, esto es + 1h, es decir, UTC + 0100.
Referencias
fuente
mktime()
puede fallar . En general, necesitapytz
convertir la hora local a utc, para obtener la marca de tiempo POSIX.int (t.strftime("%s"))
también funcionafuente
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(según lo especificado por OP). Pero realmente, dudo que% s sea un formato de tiempo agregado recientemente.%s
no es compatible (puede funcionar en algunas plataformas sit
es un objeto de fecha y hora ingenuo que representa la hora local y si la biblioteca C local tiene acceso a la base de datos tz, de lo contrario, el resultado puede ser incorrecto). No lo uses%s
no está documentado en ningún lado. Lo siembro en código real y me preguntaba qué es esto y miro en la documentación y no existe tal cosa%s
. Solo hay una gran S solo por unos segundos.de los documentos de Python:
Devuelve el número total de segundos contenidos en la duración. Equivalente a
calculado con verdadera división habilitada.
Tenga en cuenta que para intervalos de tiempo muy largos (más de 270 años en la mayoría de las plataformas) este método perderá precisión de microsegundos.
Esta funcionalidad es nueva en la versión 2.7.
fuente
Para convertir un objeto de fecha y hora que represente la hora en UTC a la marca de tiempo POSIX :
Para convertir un objeto de fecha y hora que representa la hora en la zona horaria local a la marca de tiempo POSIX:
Consulte ¿Cómo convierto la hora local a UTC en Python? Si la base de datos tz está disponible en una plataforma determinada; una solución solo stdlib puede funcionar .
Siga los enlaces si necesita soluciones para las
<3.3
versiones de Python.fuente
Probé el calendar.timegm de la biblioteca estándar y funciona bastante bien:
Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm
fuente
aDateTime
es una hora UTC