2016-07-28 2 views
1

J'ai une chaîne lfile avec un datetime en elle (type(lfile) donne <type 'str'>) et un objet datetime Python wfile. Voici le code:Python convertir la chaîne en datetime pour la comparaison à l'objet datetime

import os, datetime 
lfile = '2005-08-22_11:05:45.000000000' 
time_w = os.path.getmtime('{}\\{}.py' .format('C:\Temp_Readouts\RtFyar','TempReads.csv')) 
wfile = datetime.datetime.fromtimestamp(time_w) 

wfile contient ce 2006-11-30 19:08:06.531328 et repr(wfile) donne:

datetime.datetime(2006, 11, 30, 19, 8, 6, 531328) 

Problème:

J'ai besoin de:

  1. convertir lfile en Python objet datetime
  2. comparer lfile-wfile et déterminer qui datetime est plus récente

Pour 1 .:

Je ne suis en mesure d'obtenir une solution partielle à l'aide strptime selon here. Voici ce que j'ai essayé:

lfile = datetime.datetime.strptime(linx_file_dtime, '%Y-%m-%d_%H:%M:%S') 

La sortie est:

`ValueError: unconverted data remains: .000` 

Question 1

Il semble que strptime()cannot gérer les nanosecondes. Comment puis-je dire strptime() pour ignorer les 3 derniers zéros?

Pour 2 .:

Quand j'utilise type(wfile) je reçois <type 'datetime.datetime'>. Si les deux wfile et lfile sont des objets datetime Python (si l'étape 1. est réussie), serait alors this travail ?:

if wtime < ltime: 
    print 'Linux file created after Windows file' 
else: 
    print 'Windows file created after Linux file' 

Question 2

Ou est-il une autre façon dont Python peut comparer les objets datetime pour déterminer lequel des deux a eu lieu après l'autre?

Répondre

2

Question 1

Python gère les microsecondes, pas nanosecondes.Vous pouvez dépouiller les trois derniers caractères du temps pour le convertir en microsecondes, puis ajouter .%f à la fin:

lfile = datetime.datetime.strptime(linx_file_dtime[:-3], '%Y-%m-%d_%H:%M:%S.%f') 

Question 2

Oui, fonctionne la comparaison:

if wtime < ltime: 
    ... 
+0

Merci! C'est ce qu'il a fait. –

1

C'est vrai, strptime() ne gère pas les nanosecondes. La réponse acceptée dans la question que vous avez liée à offre une option: dépouiller les 3 derniers chiffres, puis analyser avec .%f ajouté à la chaîne de format.

Une autre option consiste à utiliser dateutil.parser.parse():

>>> from dateutil.parser import parse 
>>> parse('2005-08-22_11:05:45.123456789', fuzzy=True) 
datetime.datetime(2005, 8, 22, 11, 5, 45, 123456) 

fuzzy=True est nécessaire d'oublier le trait de soulignement non pris en charge entre les composants date et l'heure. Comme les objets datetime ne supportent pas les nanosecondes, les 3 derniers chiffres disparaissent, laissant une précision de l'ordre de la microseconde.

+0

Ha! Toutes mes excuses pour avoir manqué cela. Il semble que la question ait déjà reçu une réponse dans le lien précédent que j'ai posté. Merci pour votre réponse aussi! –