2016-07-28 15 views
1

Ich habe eine Zeichenfolge lfile mit einer Datetime drin (type(lfile) gibt <type 'str'>) und einem Python-Datetime-Objekt wfile. Hier ist der Code:Python konvertieren Zeichenfolge in Datetime zum Vergleich mit Datetime-Objekt

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 enthält diese 2006-11-30 19:08:06.531328 und repr(wfile) gibt:

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

Problem:

Ich muss:

  1. lfile in eine Python konvertieren Datetime-Objekt
  2. vergleichen lfile-wfile und bestimmt, welche Datumzeit aktueller ist

Für 1 .:

Ich bin nur in der Lage eine Teillösung erhalten mit strptime gemäß here. Hier ist, was ich versucht:

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

Die Ausgabe lautet:

`ValueError: unconverted data remains: .000` 

Frage 1

Es scheint, dass strptime()cannot die Nanosekunden behandeln. Wie kann ich strptime() sagen, um die letzten 3 Nullen zu ignorieren?

für 2 .:

Als ich type(wfile) verwende ich <type 'datetime.datetime'> bekommen. Wenn beide wfile und lfile Datetime-Objekte Python sind (dh, wenn Schritt 1 erfolgreich ist), würde dann this Arbeit ?:

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

Frage 2

Oder gibt es eine andere Art und Weise, kann Python Vergleichen Sie Datetime-Objekte, um zu bestimmen, welche der beiden nach der anderen aufgetreten ist?

Antwort

2

Frage 1

Python behandelt Mikrosekunden, nicht Nanosekunden.Sie können die letzten drei Zeichen der Zeit, es zu Mikrosekunden zu konvertieren Streifen und fügen Sie dann .%f bis zum Ende:

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

Frage 2

Ja, Vergleich funktioniert:

if wtime < ltime: 
    ... 
+0

Danke! Das hat es getan. –

1

Das ist richtig, strptime() behandelt nicht Nanosekunden. Die akzeptierte Antwort in der Frage, die Sie verknüpft haben, bietet eine Option: Entfernen Sie die letzten 3 Ziffern und parsen Sie dann mit .%f, die an die Formatzeichenfolge angehängt wurde.

Eine weitere Option ist dateutil.parser.parse() zu verwenden:

>>> 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 erforderlich ist, die nicht unterstützten Strich zwischen Datums- und Zeitkomponenten zu übersehen. Da datetime Objekte keine Nanosekunden unterstützen, verschwinden die letzten drei Stellen, was eine Genauigkeit im Mikrosekundenbereich ermöglicht.

+0

Ha! Entschuldigung dafür, dass ich das verpasst habe. Es scheint, als wäre die Frage bereits in dem früheren Link beantwortet worden, den ich gepostet habe. Danke auch für deine Antwort! –