260 votes

Comment convertir un timestamp entier en datetime Python ?

Je dispose d'un fichier de données contenant des horodatages du type "1331856000000". Malheureusement, je n'ai pas beaucoup de documentation pour le format, donc je ne suis pas sûr de la façon dont l'horodatage est formaté. J'ai essayé la méthode standard de Python, à savoir datetime.fromordinal() y datetime.fromtimestamp() et quelques autres, mais rien ne correspond. Je suis presque sûr que ce numéro particulier correspond à la date du jour (par exemple 2012-3-16), mais pas beaucoup plus.

Comment puis-je convertir ce nombre en un datetime ?

471voto

Tadeck Points 37046

datetime.datetime.fromtimestamp() est correcte, sauf que vous avez probablement un timestamp en milisecondes (comme en JavaScript), mais fromtimestamp() attend un timestamp Unix, en secondes.

Fais-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 : J.F. Sebastian a correctement suggéré à utiliser la division réelle par 1e3 (float 1000 ). La différence est significative, si vous souhaitez obtenir des résultats précis, c'est pourquoi j'ai modifié ma réponse. La différence résulte du comportement par défaut de Python 2.x, qui renvoie toujours int en divisant (en utilisant / opérateur) int par int (cela s'appelle division du plancher ). En remplaçant le diviseur 1000 (étant un int ) avec le 1e3 diviseur (étant la représentation de 1000 comme flotteur) ou avec float(1000) (ou 1000. etc.), la division devient véritable division . Retour de Python 2.x float en divisant int par float , float par int , float par float etc. Et quand il y a une partie fractionnaire dans l'horodatage transmis à fromtimestamp() le résultat de cette méthode contient également des informations sur cette partie fractionnaire (sous forme de nombre de microsecondes).

18 votes

Utiliser la vraie division : / 1e3

0 votes

@J.F.Sebastian : Vous avez tout à fait raison, j'ai modifié ma réponse et j'ai ajouté quelques explications sur les raisons pour lesquelles vous avez raison. Si vous n'êtes pas d'accord avec cette explication, faites-le moi savoir.

0 votes

@manu-fatto : Cela n'a pas vraiment d'importance. x * 0.001 y x / 1e3 sont toutes deux identiques, la différence réside dans la notation et la longueur (l'original est plus court). Pour certaines personnes, il peut être plus clair de diviser par le nombre au lieu de multiplier par l'unité. inverse multiplicatif nombre ( 1/x ), que vous avez proposé. Mais merci d'avoir proposé une approche alternative.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X