0

これは私の問題を簡略化したものですが、要点は次のとおりです。特定のパターンを見つけるために正規表現を使用して電子メールを並べ替えるスクリプトがあります。私が並べ替える項目の 1 つは、メールの受信日です。datetime モジュールを使用して、次のように日付文字列をフォーマットします。

    s1 = datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p').strftime('%m/%d/%Y %I:%M:%S %p')

ここで、4 つのメールを解析したとします。これらは正規表現関数の結果です。

    s1 = 'March 15, 2013 8:58:34 PM'
    s2 = 'March 15, 2013 11:10:10 AM'
    s3 = 'March 15, 2013 11:16:06 AM'
    s4 = 'April 15, 2013 12:02:04 PM'

strftime のフォーマット後は次のようになります。

    s1 = '03/15/2013 08:58:34 PM'
    s2 = '03/15/2013 11:10:10 AM'
    s3 = '03/15/2013 11:16:06 AM'
    s4 = '04/15/2013 12:02:04 PM'

これらすべてをランダムな順序でリストに入れ、次のように sort() 関数を実行すると:

    L = [s2, s1, s3, s4]
    L.sort()

出力は次のとおりです。

    ['03/15/2013 08:58:34 PM', '03/15/2013 11:10:10 AM', '03/15/2013 11:16:06 AM', '04/15/2013 12:02:04 PM']

ご覧のとおり、ソート時に「AM」と「PM」は考慮されていません。私はStackOverflowでこれに似た他の質問を数多く見てきましたが、それらはすべて、12時間時計を考慮してstrptime()/stftime()関数で%Hを%Iに変更することを提案していますが、私はすでに行っていますそれ。ソート時に %p を考慮する方法を誰か提案できますか? ありがとう!

4

1 に答える 1

7

ここでの問題は、文字列を並べ替えていることです。Pythonはこれらの文字列が時間であることを認識していないため、文字列として並べ替えるだけです(これはほとんど機能します)。

したがって、解決策は、それらが日付オブジェクトであるときにそれらをソートすることです。この時点で、Pythonはそれらを正しくソートするために必要な情報を持っています。

dates = sorted([datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p') 
                for regex_obtained_str in strings])
l = [date.strftime('%m/%d/%Y %I:%M:%S %p') for date in dates]

ここでは、リスト内包表記を使用して、すべてのオブジェクトにフォーマットを簡単に適用します。

于 2013-03-20T22:10:51.383 に答える