2012-02-10 4 views
3

私は、いくつかの場所/ログファイルから来る3つのフォーマットの可能性があるタイムスタンプを解析する、より簡潔で高速な方法があるのか​​疑問に思っています。以下のコードは私が現在持っているものですが、非常に醜い作業バージョンであり、非常に遅いです。これを達成するためのもっとpythonicと高速な方法がありますか?タイムストリングを解析するより良い方法

FORMATS = ["%Y-%m-%d %H:%M:%S"  , 
      "%Y%m%d_%H.%M.%S"  , 
      "%a %b %d %H:%M:%S %Y"] 


def _hacktime(self, t): 
    # CAUTION: 
    # The nastiest time hack of all TIME 
    # 
    try: 
     t = time.mktime(time.strptime(t, self.FORMATS[0])) 
    except: 
     try: 
      t = time.mktime(time.strptime(t, self.FORMATS[1])) 
     except: 
      try: 
       t = time.mktime(time.strptime(' '.join([t, 
               time.strftime('%Y')]), 
               self.FORMATS[2])) 
      except Exception as e: 
       print('could not convert time %s: %s' % (t, e)) 
       t = time.time() 
    return [t, time.ctime(t)] 
+0

なぜ、第3のフォーマットの時間文字列に '%Y'を追加しますか?書式文字列から単純に省略する方が簡単ではないでしょうか? –

答えて

5

使用ループ

the_time= None 
for f in FORMATS: 
    try: 
     the_time = time.mktime(time.strptime(t, f)) 
     return the_time # or break 
    except ValueError: 
     continue 
if the_time is None: 
    raise ValueError("{0!r} is not a valid time".format(t)) 
+4

私は 'try'ブロックの終わりで' break'を提案し、 'else'をチェックする代わりに' else'節をforループに使用することを提案します。 –

+0

私はこれが一番良かったのでこれを受け入れました。私の最終的な解決策は、関数にファイル拡張子を渡し、すぐに正しいパーサ形式にルーティングすることでした。 strptime()はまだ私のアプリケーションの中で最も遅いプロセスですが、私の処理を20%オフにしました。 – comamitc

1

これで、最初の2つに一致する正規表現を作成して、コンポーネントフィールドを引き出すことができます。

これは、2つのブランチに減らすと思います。なぜなら、一致が失敗すると3番目のパターンでなければならないからです。

一致する場合は、一致するすべてのフィールドがあるため、struct_timeに直接入力することもできます。

0

あなたがチェックできる「 - 」、「:」と「」のstrptimeでそれらを変換しようとする前に、文字列のためにカウントされます。試行ごとにさらに字下げしながら例外をキャッチするのではなく、ループを使用して、変換が完了したらループから抜け出す(または単に返す)。

関連する問題