2016-08-15 5 views
1

Ich habe mir viele mögliche Wege zur Python-Zeitanalyse angesehen. Using parse seems link the only method that should work. While trying to use datetime.strptime causes an error because %z does not work with python 2.7. Wenn Sie parse.parse jedoch falsch verwenden, wird die Zeitzone erkannt.Dateutil Parse-Bug in Python gibt den falschen Wert zurück

Ich analysiere beide Fri Nov 9 09:04:02 2012 -0500 und Fri Nov 9 09:04:02 2012 -0800 und bekomme den gleichen Zeitstempel in Unix-Zeit. 1352480642

  • Meine Version von Python 2.7.10
  • Meine Version von dateutil 1,5

Hier ist mein Code, der den Test läuft.

#!/usr/bin/python 
import time 
from dateutil import parser 

def get_timestamp(time_string): 
    timing = parser.parse(time_string) 
    return time.mktime(timing.timetuple()) 

test_time1 = "Fri Nov 9 09:04:02 2012 -0500" 
test_time2 = "Fri Nov 9 09:04:02 2012 -0800" 
print get_timestamp(test_time1) 
print get_timestamp(test_time2) 

Ausgabe

1352480642.0 
1352480642.0 

Erwartete Ausgabe

1352469842.0 
1352480642.0 
+0

In Python 3 bekomme ich '1352448242.0' für beide Zeilen! Sind Sie sicher, dass die Zeitzone richtig analysiert wurde? –

+0

Nicht sicher. Ich ziehe diese Saiten direkt aus GIT-Logs. Ich mache nicht die Parsing Python ist. – Whitecat

+0

Tatsache ist: Werte sind abhängig von Python-Versionen unterschiedlich! –

Antwort

1

Das hat nichts mit dem Parser zu tun, werden Sie das gleiche Verhalten sehen gerade von mktime() allein, da datetime.timetuple() hat keine Zeitzonenoffset-Informationen und mktime() ist das Inverse von localtime. Sie können dies korrigieren, indem es zu localtime Umwandlung vor timetuple() Aufruf:

from time import mktime 
from datetime import datetime 
from dateutil import tz 

dt_base = datetime(2012, 11, 9, 9, 4, 2) 

dt_est = dt_base.replace(tzinfo=tz.tzoffset('EST', -5 * 3600)) 
dt_pst = dt_base.replace(tzinfo=tz.tzoffset('PST', -8 * 3600)) 

def print_mktime(dt): 
    print(mktime(dt.timetuple())) 

# Run in UTC 
print_mktime(dt_est) # 1352469842.0 
print_mktime(dt_pst) # 1352469842.0 

# Convert to local time zone first first 
print_mktime(dt_est.astimezone(tz.tzlocal())) # 1352469842.0 
print_mktime(dt_pst.astimezone(tz.tzlocal())) # 1352480642.0 

Hinweis, dass es eine Tabelle auf der documentation for time() (python 2.x docs), die Ihnen sagt, wie zwischen diesen Darstellungen konvertieren:

From      To       Use 
--------------------------------------------------------------------------- 
seconds since the epoch | struct_time in UTC  | gmtime() 
seconds since the epoch | struct_time in local time | localtime() 
struct_time in UTC  | seconds since the epoch | calendar.timegm() 
struct_time in local time | seconds since the epoch | mktime() 

Meine persönliche Präferenz wäre, das geparste Datum zu UTC zu konvertieren, in welchem ​​Fall calendar.timegm() die passende Funktion wäre:

from calendar import timegm 
def print_timegm(dt): 
    print(timegm(dt.timetuple())) 

print_timegm(dt_est.astimezone(tz.tzutc())) # 1352469842.0 
print_timegm(dt_pst.astimezone(tz.tzutc())) # 1352480642.0 
+0

Ich mag die Idee, zuerst in die lokale Zeit zu konvertieren. Aber die Daten, mit denen ich arbeite, haben Datumssketten wie dieses 'Fri Nov 9 09:04:02 2012 -0800'. Gibt es sowieso, dass ich dies tun kann, ohne jeden Int einzeln auszuwählen datetime (2012, 11, 9, 9, 4, 2) ' – Whitecat

+0

@Whitecat Ich empfehle dringend, UTC, nicht localtime zu verwenden, um DST-bezogene Probleme zu vermeiden. Ich verstehe Ihren Einwand über die Auswahl von Ints nicht. Ich habe nur die Ausgabe des Dateutil-Parsers manuell erstellt, um zu zeigen, dass sie nichts mit dem Parser zu tun hat. Sie müssen nur die Zeitzone der Ausgabe des Parsers ändern, wie ich es in den Beispielen getan habe, bevor Sie 'templeple' aufgerufen haben. – Paul

+0

Mein Einwand gegen die manuelle Auswahl von Ints ist, dass ich diesen Parser schreiben muss, um die verschiedenen Teile des Strings zu identifizieren. Muss ich für jede Zeitzone auch einen anderen Zeitplan erstellen? Da die Zeitzonen mehrere Zeitzonen haben. – Whitecat

Verwandte Themen