0

奇妙な質問かもしれませんが、ここに行きます:

ランダムな順序で読み取っているいくつかのログファイルを解析する必要があります。ソートされたものを処理するには、抽出されたログ時間でソートする必要があります。

ログエントリは次のようになります。

l = 2001:470:1f14:169:5000:eae0:589d:c211 - SOFT12 [14/Nov/2012:09:32:46 +0100] "POST /request HTTP/1.1" 200 984 "-" "-" 181446

私はこのように日付を抽出することができます:

l.split('+', 1)[0].split('-', 1)[1].split(' ')[2].split('[')[1]

それは私に与えます:

14/Nov/2012:09:32:46

1日あたり+200万レコードの数年分のログファイルを見ているので、フォーマットと並べ替えを切り替えるためだけに、何も日時オブジェクトに変換したくありません。14/Nov/2012したがって、文字列の日付部分を並べ替え可能2012-11-14、できれば上からの便利な分割ステートメントに含めることができる文字列のみの操作を探しています...

質問:
文字列-日付を日時オブジェクトに変換せずに変更するにはどうすればよいですか?

4

2 に答える 2

1

このコードは機能します:

# Converts something like "14/Nov/2012:09:32:46"
# to "2012-11-14:09:32:46"
_MONTHS = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS.index(t[1]) + 1, int(t[0])) + p[1]
于 2013-03-08T14:41:32.817 に答える
1

リストを使用してその.index()メソッドを使用する代わりに、辞書を使用すると便利な場合があります。リストには線形検索が含まれるためです。リストが非常に短い場合でも、辞書内のハッシュ操作はより高速になる可能性があります。少なくとも試してみる価値はあります。

だから、Nayuki Minaseの解決策を取る:

# Converts something like "14/Nov/2012:09:32:46"
# to "2012-11-14:09:32:46"
_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
_MONTHS = dict((m, n + 1) for n, m in enumerate(_MONTHS)) # {"Jan": 1, "Feb: 2, ...} 
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS[t[1]], int(t[0])) + p[1]

または(時間を節約するため)

  return "%s-%02d-%s:" % (t[2], _MONTHS[t[1]], t[0]) + p[1]

日付がすでに正しい形式 (先行 0) であることが確実な場合。

于 2013-03-08T14:52:15.060 に答える