Como converter timestamp inteiro para data e hora Python

189

Eu tenho um arquivo de dados contendo registros de data e hora como "1331856000000". Infelizmente, não tenho muita documentação para o formato, portanto, não tenho certeza de como o carimbo de data e hora está formatado. Eu tentei padrão do Python datetime.fromordinal()e datetime.fromtimestamp()e alguns outros, mas partidas nada. Tenho certeza de que esse número específico corresponde à data atual (por exemplo, 2012-3-16), mas não muito mais.

Como faço para converter esse número em um datetime?

Cerin
fonte

Respostas:

329

datetime.datetime.fromtimestamp()está correto, exceto que você provavelmente está tendo o registro de data e hora em milissegundos (como no JavaScript), mas fromtimestamp()espera o registro de data e hora do Unix, em segundos.

Faça assim:

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

e o resultado é:

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

Responde a sua pergunta?

EDIT : JF Sebastian sugeriu corretamente o uso de divisão verdadeira por 1e3(float 1000). A diferença é significativa, se você deseja obter resultados precisos, mudei minha resposta. A diferença resulta do comportamento padrão do Python 2.x, que sempre retorna intao dividir (usando o /operador) intpor int(isso é chamado de divisão de piso ). Substituindo o divisor 1000(sendo um int) pelo 1e3divisor (sendo representação de 1000como flutuador) ou por float(1000)(ou 1000.etc.), a divisão se torna verdadeira divisão . O Python 2.x retorna floatao dividir intpor float, floatpor int,floatpor floatetc. E quando houver uma parte fracionária no carimbo de data / hora passada para o fromtimestamp()método, o resultado desse método também conterá informações sobre essa parte fracionária (como o número de microssegundos).

Tadeck
fonte
13
use true division:/ 1e3
jfs 16/03/12
@JFSebastian: Você está totalmente correto, editei minha resposta e adicionei algumas explicações sobre por que você está certo. Se você não concordar com a explicação, entre em contato.
Tadeck 16/03/12
@ manu-fatto: Isso realmente não importa. x * 0.001e x / 1e3são os mesmos, a diferença está na notação e no comprimento (o original é mais curto). Para algumas pessoas, pode ser mais claro dividir pelo número, em vez de multiplicar pelo número inverso multiplicativo ( 1/x), que você propôs. Mas obrigado por propor uma abordagem alternativa.
Tadeck
58
Essa função é perigosa porque leva em consideração o fuso horário. Tente procurar utcfromtimestamp
Haim Bender
12
@HaimBender Thanks! Sinto que seus comentários merecem mais atenção. fromtimestampfornece a data e a hora no horário local, utcfromtimestampfornece a data e a hora no UTC.
yusong 4/12/16