2016-08-08 13 views
0

ich einen Zeitstempel aus einer E-Mail wie diese zu erhalten bin versucht:Python27 - in Datetime-Objekt konvertieren Tupel Zeit

Received: by 10.64.149.4 with SMTP id tw4csp1211013ieb; 
    Thu, 4 Aug 2016 07:02:01 -0700 (PDT) 

Zunächst einmal ich den Zeitstempel analysieren mit:

d = email.utils.parsedate('Thu, 4 Aug 2016 07:02:01 -0700 (PDT)') 

Result: (2016, 8, 4, 7, 2, 1, 0, 1, -1) 

Hier kommt das Problem. Ich versuche das Ergebnis in ein Datum zu konvertieren, aber vergebens.

d = email.utils.parsedate('Thu, 4 Aug 2016 07:02:01 -0700 (PDT)') 

date_object = datetime(d) 

Result: Traceback (most recent call last): 
    File "data.py", line 12, in <module> 
    date_object = datetime(d) 
TypeError: an integer is required 

Was ist das Problem?

+0

lesen über 'datetime.strptime': https://docs.python.org/3.4/library/datetime.html#datetime.datetime.strptime und https://docs.python.org/3.4/library/datetime.html#strftime -strptime-Verhalten – DeepSpace

+0

@DeepSpaceI Ich kann nicht mit strptime arbeiten, weil das Format% Z eine schlechte Direktive ist – echo

+0

Was bedeutet was? – DeepSpace

Antwort

2

email.utils.parsedatereturns a 9 tuple similar to the structure struct_time but with the index 6,7 and 8 unusable

struct_time:

Index Attribute Values 
0  tm_year  (for example, 1993) 
1  tm_mon  range [1, 12] 
2  tm_mday  range [1, 31] 
3  tm_hour  range [0, 23] 
4  tm_min  range [0, 59] 
5  tm_sec  range [0, 61]; see (2) in strftime() description 
6  tm_wday  range [0, 6], Monday is 0 
7  tm_yday  range [1, 366] 
8  tm_isdst 0, 1 or -1 

Und datetime Objekte erfordern unterschiedliche Werte für den Konstruktor tun

datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])

Sie können direkt eine datetime mit den nützlichen Teile des Tupels als

date_object = datetime(*d[0:6])


bearbeiten erstellen: Vorsicht mit diesem, weil dies das Objekt in Ortszeit erstellen, die Zeitzoneninformationen zu vernachlässigen.


Edit 2: Sie können dieses Problem lösen strptime unter Verwendung Sie müssen nur die (PDT) vom Ende der Schnur geschnitten, da die PDT für tzinfo kein gültiger Name ist, aber -0700 ist genug

1

Die letzten beiden Elemente des Tupels sind seltsam, sie sehen nicht wie Zeitzonendaten aus. Aber wenn Sie nicht Zeitzone bewusst datetime Objekt benötigen, können Sie so etwas wie dieses datetime(*d[:-2])