Cómo convertir la marca de tiempo entera a la fecha y hora de Python

189

Tengo un archivo de datos que contiene marcas de tiempo como "1331856000000". Desafortunadamente, no tengo mucha documentación para el formato, por lo que no estoy seguro de cómo se formatea la marca de tiempo. He intentado estándar de Python datetime.fromordinal()y datetime.fromtimestamp()y algunos otros, pero nada se compara. Estoy bastante seguro de que ese número en particular corresponde a la fecha actual (por ejemplo, 2012-3-16), pero no mucho más.

¿Cómo convierto este número a a datetime?

Cerin
fuente

Respuestas:

329

datetime.datetime.fromtimestamp() es correcto, excepto que probablemente tenga una marca de tiempo en milisegundos (como en JavaScript), pero fromtimestamp() espera la marca de tiempo de Unix, en segundos.

Hazlo así:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

y el resultado es:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

¿Responde tu pregunta?

EDITAR : JF Sebastian sugirió correctamente usar la verdadera división por 1e3(flotante 1000). La diferencia es significativa, si desea obtener resultados precisos, por lo tanto, cambié mi respuesta. La diferencia resulta del comportamiento predeterminado de Python 2.x, que siempre regresa intal dividir (usando el /operador) intpor int(esto se llama división de piso ). Al reemplazar el divisor 1000(siendo un int) con el 1e3divisor (siendo la representación de 1000como flotante) o con float(1000)(o 1000.etc.), la división se convierte en verdadera división . Python 2.x regresa floatcuando se divide intpor float,float por int,floatpor floatetc. Y cuando hay una parte fraccional en la marca de tiempo pasada al fromtimestamp()método, el resultado de este método también contiene información sobre esa parte fraccionaria (como el número de microsegundos).

Tadeck
fuente
13
use la verdadera división:/ 1e3
jfs
@JFSebastian: Tienes toda la razón, he editado mi respuesta y he agregado alguna explicación de por qué tienes razón. Si no está de acuerdo con la explicación, hágamelo saber.
Tadeck
@ manu-fatto: Eso realmente no importa. x * 0.001y x / 1e3son ambos iguales, la diferencia está en la notación y la longitud (la original es más corta). Para algunas personas puede ser más claro dividir por el número en lugar de multiplicar por el número inverso multiplicativo ( 1/x), que propusiste. Pero gracias por proponer un enfoque alternativo.
Tadeck el
58
Esta función es peligrosa porque tiene en cuenta su zona horaria. Intenta buscar utcfromtimestamp
Haim Bender
12
@HaimBender Gracias! Siento que sus comentarios merecen más atenciones. fromtimestampdarle la fecha y hora en hora local utcfromtimestample da la fecha y hora en UTC.
yusong