40

私はほとんど正しい日時のデータベースを持っていますが、いくつかは次のように壊れています:Sat Dec 22 12:34:08 PST 20102015

無効な年がなければ、これは私にとってはうまくいきました:

end_date = soup('tr')[4].contents[1].renderContents()
end_date = time.strptime(end_date,"%a %b %d %H:%M:%S %Z %Y")
end_date = datetime.fromtimestamp(time.mktime(end_date))

しかし、無効な年を持つオブジェクトにヒットすると、 が得られますValueError: unconverted data remains: 2。これは素晴らしいことですが、その年から悪い文字を取り除く最善の方法がわかりません。それらは 2 から 6 までの範囲unconverted charactersです。

ポインタはありますか?スライスするだけend_dateですが、日時に安全な戦略があることを願っています。

4

5 に答える 5

27

書き直したい場合を除きstrptime(非常に悪い考えです)、唯一の現実的なオプションはend_date、意図した正しい結果が得られると仮定して、最後に余分な文字をスライスして切り取ることです。

たとえばValueError、スライスをキャッチして、再試行できます。

def parse_prefix(line, fmt):
    try:
        t = time.strptime(line, fmt)
    except ValueError as v:
        if len(v.args) > 0 and v.args[0].startswith('unconverted data remains: '):
            line = line[:-(len(v.args[0]) - 26)]
            t = time.strptime(line, fmt)
        else:
            raise
    return t

例えば:

parse_prefix(
    '2015-10-15 11:33:20.738 45162 INFO core.api.wsgi yadda yadda.',
    '%Y-%m-%d %H:%M:%S'
) # -> time.struct_time(tm_year=2015, tm_mon=10, tm_mday=15, tm_hour=11, tm_min=33, ...
于 2011-02-18T18:56:27.443 に答える
23

ええ、私は余分な数字を切り取るだけです。それらが常に日付文字列に追加されると仮定すると、次のようなものが機能します。

end_date = end_date.split(" ")
end_date[-1] = end_date[-1][:4]
end_date = " ".join(end_date)

例外から余分な桁数を取得しようとしましたが、インストールされている Python のバージョン (2.6.6 および 3.1.2) では、その情報は実際にはありません。データがフォーマットと一致しないことを示しているだけです。もちろん、例外が発生しなくなるまで、一度に 1 桁ずつ切り捨てて再解析を続けることもできます。

年の正しい桁数を含め、有効な日付のみに一致する正規表現を作成することもできますが、それはやり過ぎのように思えます。

于 2011-02-18T18:57:11.657 に答える
6

Adam Rosenfield のコードの改善 (希望):

import time

for end_date in ( 'Fri Feb 18 20:41:47 Paris, Madrid 2011',
                  'Fri Feb 18 20:41:47 Paris, Madrid 20112015'):

    print end_date

    fmt = "%a %b %d %H:%M:%S %Z %Y"
    try:
        end_date = time.strptime(end_date, fmt)
    except ValueError, v:
        ulr = len(v.args[0].partition('unconverted data remains: ')[2])
        if ulr:
            end_date = time.strptime(end_date[:-ulr], fmt)
        else:
            raise v

    print end_date,'\n'
于 2011-02-18T19:45:55.770 に答える
0

strptime()は正しくフォーマットされた日付が表示されることを期待しているため、end_date呼び出す前におそらく文字列を変更する必要があります。

これは、最後の項目end_dateを 4 文字に切り刻む 1 つの方法です。

chop = len(end_date.split()[-1]) - 4
end_date = end_date[:-chop]
于 2011-02-18T18:59:21.850 に答える