2010-10-29 11 views
9

Ich möchte Daten in diesem Format analysieren, aber Teile der Zeichenfolge ignorieren. 'Mi, 27 Oct 1770 22:17:00 GMT' Von dem, was ich gesammelt habe, unterstützt datetime die Zeitzonen nicht sehr gut. Was gut ist, ich möchte nur den Zeitzonen-Teil der Saite ignorieren, ohne eine Saitenmanipulation durchführen zu müssen. Gibt es etwas, das ich% Z durch unten ersetzen kann, um "irgendeine Zeichenkette hier" zu sagen und Daten als solche zu analysieren? Auch verstehe ich nicht, warum es Zeitzonen wie PST, GMT aber nicht EST analysieren wird. Es scheint auf keinen Fall tzinfo anzuhängen, nicht sicher, welche Art von String wirklich nach dem% Z-Teil sucht.Python analysieren Datumsformat, Teile der Zeichenfolge ignorieren

>>> import datetime 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z') 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 PST', '%a, %d %b %Y %H:%M:%S %Z') 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 EST', '%a, %d %b %Y %H:%M:%S %Z') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/brazil-pkg-cache/packages/Python/Python-2.5.1.17.1/RHEL5_64/DEV.STD.PTHREAD/build/lib/python2.5/_strptime.py", line 331, in strptime 
    (data_string, format)) 
ValueError: time data did not match format: data=Wed, 27 Oct 1770 22:17:00 EST fmt=%a, %d %b %Y %H:%M:%S %Z 

Hinweis: dateutil für mich keine Option ist, möchte ich falsch zahlreiche Formate und kann nicht zulassen, dass dateutil versehentlich Daten interpretieren unterstützen. (d. h. dateutil scheint eine Schätzung zu verwenden, wenn Daten wie 01/02/2010, 1. Februar oder 2. Januar angezeigt werden). Ich möchte einfach nur versuchen, Formate zu akzeptieren, die ich in einer Bestellung angegeben habe, bis ich ein Match bekomme.

Antwort

1

Ich denke nicht, dass es möglich ist, das komplett ohne String-Manipulationen zu machen, aber vielleicht ist das eine Option. Schauen Sie sich Zeit und versuchen, etwas wie folgt aus:

datetime(*(time.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')[0:5])) 
0

Es ist kein Weg zu sein scheint, dass in strptime() zu tun. Ich weiß, dass du gesagt hast, dass du keine String-Manipulation machen willst, aber du hast vielleicht keine Wahl. Sie können entweder Daten bereinigen, bei denen Sie zuerst die Datums-/Uhrzeitzeichenfolge aus der Eingabe herausschnüffeln, oder Sie können mystrptime() erstellen und nur die Manipulation in der Ausnahme durchführen. Der folgende Code ist insofern falsch, als er den allgemeinen Fall von% Z an keiner Stelle in der Zeichenfolge behandelt, aber Sie erhalten die Idee.

import re, datetime 

def mystrptime(time_str, format): 
    try: 
     return datetime.datetime.strptime(time_str, format) 
    except ValueError: 
     if not '%Z' in format: 
      raise # it must have been something else 
     new_time_str = re.sub(r'\s*\w+\s*$', '', time_str) 
     new_format = re.sub(r'\s*%Z\s*$', '', format) 
     return datetime.datetime.strptime(new_time_str, new_format) 
4

Haben Sie tatsächlich die Dokumente für Dateutil angeschaut?

dateutil.parser.parse() hat Argumente, die let you control der Vorrang in seinem Format Guesser und es hat auch eine ignoretz=True Argument.

Wenn das nicht genug ist, gibt es wahrscheinlich eine Klasse, die Sie überschreiben können, um Ihre eigenen Vorrangregeln zu implementieren.

Wenn nicht, müssen Sie wahrscheinlich auf String-Parsing zurückgreifen, da die python-Implementierung von strptime() die zugrunde liegende C-Implementierung aufruft, um die Zeitzonennamen aufzulösen. (Ich weiß nicht, warum EST für Sie nicht verständlich ist, aber es ist wahrscheinlich systemweit und auf einigen Systemen kein Problem)

3
val = str.join(' ', 'Wed, 17 Oct 2011 22:22:22 +0300'.split(None)[1:7]) 

val = datetime.datetime.strptime(val, '%d %b %Y %H:%M:%S') 
+5

Reine Codeantworten sind an sich nicht hilfreich, da sie dazu neigen promote _copy-and-paste programming._ Wann immer es möglich ist, sollte eine Erklärung des Codes und _why_ es funktioniert. :) – Miguel

+0

Obwohl ich stimme @Miguel, +1 für eine eindeutige Antwort, die die Frage anspricht. –

+0

Ist das nicht einfacher: '.join (' Mi, 17 Oct 2011 22:22:22 + 0300'.split() [1: 6]) Auch das obige funktioniert nicht b/c der Zeitzoneneinstellung. Sie erhalten ValueError: nicht konvertierte Daten bleiben erhalten – radtek

Verwandte Themen