Como crio uma data e hora no Python a partir de milissegundos?

142

Eu posso criar um objeto Date semelhante em Java por java.util.Date (milissegundos) . Como crio o comparável em Python?

Aloca um objeto Date e o inicializa para representar o número especificado de milissegundos desde o tempo base padrão conhecido como "a época", ou seja, 1 de janeiro de 1970, 00:00:00 GMT.

Joshua
fonte

Respostas:

215

Basta convertê-lo em timestamp

datetime.datetime.fromtimestamp(ms/1000.0)
vartec
fonte
17
Uma observação - no Python 3, (/) executará a divisão de ponto flutuante. Para executar a divisão integral, use (//).
John Millikin
3
Você não quer mesmo a divisão de flutuação? Caso contrário, você estará perdendo precisão abaixo de 1 segundo (mantida na parte fracionária do carimbo de data / hora). Melhor usar o ms / 1000.0 sem truncamento.
Brian
4
Certamente datetime sempre suporta isso? Se tivermos precisão de menos de um segundo, parece errado jogá-la fora. Se não o fizermos, nenhum dano será causado - mantemos a precisão original.
187 Brian
30
Para manter a precisão sem o uso de carros alegóricos, você também pode fazer:datetime.utcfromtimestamp(ms//1000).replace(microsecond=ms%1000*1000)
TSG
2
outro problema com esta solução: "fromtimestamp () pode aumentar ValueError, se o timestamp estiver fora do intervalo de valores suportados pelas funções C localtime () ou gmtime () da plataforma C. É comum que isso seja restrito a anos em 1970 a 2038. " - quanto tempo seu código deve durar ???
Mike rodent
12

Que tal isso? Presumo que se possa contar com datas anteriores a 1970 e depois 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 mencionado na lib padrão do Python:

fromtimestamp () pode aumentar ValueError, se o timestamp estiver fora do intervalo de valores suportados pelas funções C localtime () ou gmtime () da plataforma C. É comum que isso se restrinja aos anos de 1970 a 2038.

microfone roedor
fonte
6
você poderia usarutc_time = datetime(1970, 1, 1) + timedelta(milliseconds=millis)
jfs
9

Um pouco pesado por usar pandas, mas funciona:

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

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