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.datea 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
timedeltaobjeto, 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
datetimedebe incluirla en UTC. Si aúndatetimeno está en UTC, deberá convertirlo antes de usarlo o adjuntar unatzinfoclase que tenga el desplazamiento adecuado.Como se señaló en los comentarios, si tiene un
tzinfoadjunto a sudatetime, también necesitará uno en la fecha de inicio o la resta fallará; para el ejemplo anterior, agregaríatzinfo=pytz.utcsi usa Python 2 otzinfo=timezone.utcsi 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
tes 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 (pytzes 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.912el 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, necesitapytzconvertir 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.%sno es compatible (puede funcionar en algunas plataformas sites 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%sno 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.3versiones 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
aDateTimees una hora UTC