Comment convertir un horodatage entier en datetime Python

189

J'ai un fichier de données contenant des horodatages comme "1331856000000". Malheureusement, je n'ai pas beaucoup de documentation sur le format, donc je ne sais pas comment l'horodatage est formaté. J'ai essayé le standard de Python datetime.fromordinal()et datetime.fromtimestamp()et quelques autres, mais les matches de rien. Je suis presque sûr que ce nombre particulier correspond à la date actuelle (par exemple, 2012-3-16), mais pas beaucoup plus.

Comment convertir ce nombre en un datetime?

Cerin
la source

Réponses:

329

datetime.datetime.fromtimestamp()est correct, sauf que vous avez probablement un horodatage en millisecondes (comme en JavaScript), mais fromtimestamp()attend un horodatage Unix, en secondes.

Faites-le comme ça:

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

et le résultat est:

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

Cela répond-il à votre question?

EDIT : JF Sebastian a correctement suggéré d' utiliser la vraie division par 1e3(float 1000). La différence est significative, si vous souhaitez obtenir des résultats précis, j'ai donc changé de réponse. La différence résulte du comportement par défaut de Python 2.x, qui renvoie toujours intlors de la division (à l'aide de l' /opérateur) intpar int(c'est ce qu'on appelle la division par étage ). En remplaçant le diviseur 1000(étant un int) par le 1e3diviseur (étant une représentation de 1000comme float) ou par float(1000)(ou 1000.etc.), la division devient une vraie division . Python 2.x retourne floatlors de la division intpar float, floatpar int,floatpar floatetc. Et quand il y a une partie fractionnaire dans l'horodatage passé à la fromtimestamp()méthode, le résultat de cette méthode contient également des informations sur cette partie fractionnaire (en nombre de microsecondes).

Tadeck
la source
13
utiliser la vraie division:/ 1e3
jfs
@JFSebastian: Vous avez tout à fait raison, j'ai édité ma réponse et ajouté quelques explications pour lesquelles vous avez raison. Si vous n'êtes pas d'accord avec l'explication, veuillez me le faire savoir.
Tadeck
@ manu-fatto: Cela n'a pas vraiment d'importance. x * 0.001et x / 1e3sont tous les deux identiques, la différence réside dans la notation et la longueur (celle d'origine est plus courte). Pour certaines personnes, il peut être plus clair de diviser par le nombre au lieu de multiplier par le nombre inverse multiplicatif ( 1/x), que vous avez proposé. Mais merci d'avoir proposé une approche alternative.
Tadeck
58
Cette fonction est dangereuse, car prend en compte votre fuseau horaire. Essayez de rechercher utcfromtimestamp
Haim Bender
12
@HaimBender Merci! J'ai l'impression que vos commentaires méritent plus d'attention. fromtimestampvous donne la date et l'heure en heure locale utcfromtimestampvous donne la date et l'heure en UTC.
yusong