2

ドイツの日付をMONTHYEAR形式で解析する必要があります。MONTHは月のフルネームです。Pythonで適切なロケールを設定してから、で日付を解析してみますstrptime。例えば:

locale.setlocale(locale.LC_ALL, "deu_deu") # Locale name on Windows
datetime.strptime(dt, "%B %Y")

名前にASCII以外の文字が含まれている月に遭遇すると、 。が表示されUnicodeEncodeErrorます。日付は、Webサービスを介して配信されるXMLファイルから取得されます。日付文字列をそれが機能するように変換する方法はありstrptimeますか?

4

2 に答える 2

3

答えはありません。ただのテストです (ただし、Unix では):

>>> import locale, datetime
>>> locale.setlocale(locale.LC_ALL, "de_de")
>>> datetime.datetime.strptime("März 2012", "%B %Y")
datetime.datetime(2012, 3, 1, 0, 0)

上記は期待どおりに機能します。入力として Unicode をシミュレートするようになりました - März にはLATIN SMALL LETTER A WITH DIAERESISが含まれています。

>>> datetime.datetime.strptime("M\u00E4rz 2012", "%B %Y"))
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' ...

組み込みの unicode 関数を使用しても同じことが実現できます。

>>> datetime.datetime.strptime(unicode("März 2012", "utf-8"), "%B %Y")
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' ....

適切なエンコーディングを試してください:

>>> datetime.datetime.strptime(u"M\u00E4rz 2012".encode('utf-8'), "%B %Y")
datetime.datetime(2012, 3, 1, 0, 0)

繰り返しますが、これは Windows ではないため、実際には答えではありませんが、ヒントが含まれている可能性があります。


もう少し調査するために、データの外部ソースを扱うシナリオ (この例では JSON を使用し、XML では YMMV を使用):

適切な JSON エンコーダーがユニコードを提供すると思います。RFC4627はそれを示唆しているようです:

任意の文字をエスケープできます。文字が基本多言語面 (U+0000 から U+FFFF まで) にある場合、6 文字のシーケンスとして表すことができます。文字のコードポイント。16 進文字の A から F は、大文字または小文字にすることができます。

したがって、Pythonでそれをシミュレートするには(誰もJSONをそのように解析しないでしょう。これは単なるシミュレーションです):

>>> import json
>>> s = json.dumps({"date" : "März 2012"}).split(":")[1].replace(
        '"', "").replace("}", "").strip().decode("unicode_escape")
>>> # and sure enough ...
>>> datetime.datetime.strptime(s, "%B %Y")
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4 ...

>>> # and again, with the right encoding ...
>>> datetime.datetime.strptime(s.encode("utf-8"), "%B %Y")
datetime.datetime(2012, 3, 1, 0, 0)
于 2012-06-27T22:03:08.467 に答える
1

次のコードは問題を解決します。

locale.setlocale(locale.LC_ALL, "deu_deu") # Locale name on Windows
datetime.strptime(dt.encode("iso-8859-16"), "%B %Y") 
于 2012-10-19T17:20:36.043 に答える