¿Cómo creo una fecha y hora en Python a partir de milisegundos?

142

Puedo crear un objeto Date similar en Java mediante java.util.Date (milisegundos) . ¿Cómo creo el comparable en Python?

Asigna un objeto Date y lo inicializa para representar el número especificado de milisegundos desde el tiempo base estándar conocido como "la época", es decir, el 1 de enero de 1970, 00:00:00 GMT.

Joshua
fuente

Respuestas:

215

Solo conviértalo a marca de tiempo

datetime.datetime.fromtimestamp(ms/1000.0)
vartec
fuente
17
Una nota: en Python 3, (/) realizará una división de punto flotante. Para realizar la división integral, use (//).
John Millikin
3
¿No quieres realmente la división de flotación de todos modos? De lo contrario, perderá cualquier precisión por debajo de 1 segundo (mantenida en la parte fraccionaria de la marca de tiempo). Es mejor usar ms / 1000.0 sin truncamiento.
Brian el
44
¿Seguramente datetime siempre lo admite? Si tenemos una precisión inferior al segundo, parece incorrecto tirarla a la basura. Si no lo hacemos, no hay daño, solo conservamos esa precisión original.
Brian, el
30
Para mantener la precisión sin usar flotadores, también puede hacer:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
tsg
2
otro problema con esta solución: "fromtimestamp () puede aumentar ValueError, si la marca de tiempo está fuera del rango de valores admitidos por las funciones de plataforma C localtime () o gmtime (). Es común que esto se restrinja a años en 1970 hasta 2038. " - ¿Cuánto tiempo se espera que dure tu código?
Mike roedor
12

¿Qué hay de esto? Supongo que se puede contar para manejar las fechas antes de 1970 y después de 2038.

target_date_time_ms = 200000 # or whatever
base_datetime = datetime.datetime( 1970, 1, 1 )
delta = datetime.timedelta( 0, 0, 0, target_date_time_ms )
target_date = base_datetime + delta

como se menciona en la lib estándar de Python:

fromtimestamp () puede aumentar ValueError, si la marca de tiempo está fuera del rango de valores admitidos por las funciones de plataforma C localtime () o gmtime (). Es común que esto se restrinja a los años 1970 a 2038.

Mike roedor
fuente
66
podrías usarutc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs
9

Poco pesado debido al uso de pandas pero funciona:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
mde
fuente
2
import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')
Artem Krylov
fuente