2011-01-06 15 views
3

私は1つのアクションが普通の文字列をdatetimeに変換することであるデータのセットを処理しようとするループを持っています。すべては時々奇妙なことを起こった以外正常に動作します...ここで私はPythonはdatetimeに文字列を変換します

  • 関数を入力すると同じパラメータは、これらのパラメータは、同じタイプ常に
  • 私が最初に実行したときです
  • 常に正確がいることを知っているものですそれはいつも動かす
  • これは、appxの80%スローと値エラー(時刻データがフォーマットと一致しない)のループの2番目の要素に到達すると
  • ですが、もう一度実行した後はすべて正常です。次のemelementに立ち往生します...

私の機能はかなり大きいと私は右ここに書いたwhitch私はちょうど明確化のために、いくつかのsapleコードを提供することを決定しhapping多くのものがあるので:これは明らかに私のプログラムで動作しますが、

data = ['January 20 1999', 'March 4 2010', 'June 11 1819'] 
dformat = '%B %d %Y' 

for item in data: 
    out = datetime.datetime.strptime(item, dformat) 
    print out 

は、それdoesntの...おかげで

ところで、私が思い付いたてきたすべてのものを試してみるが、haventは、したがって、まだ成功して、私はあなたが提供するすべてのアイデアと喜んでいるだろう:エラーは私はいつもこの

ValueError: time data did not match format: data=March 4 2010 fmt=%B %d %Y 
のようなルックスを取得
+3

いくつかのコードの代わりに動作しないコードを投稿することを検討してください。これは、壊れたコードのバグを見つけるのに役立ちます。 –

+0

提供されたコードに何も問題はありません(実際には[ここ](http://codepad.org/zVzHUhkV)でご覧になれます) –

+1

@Sven Marnach: –

答えて

7

異なるロケールが設定されている可能性があります。 %Bは英語を使用するロケールでは3月ですが、他のロケールでは失敗します。例えば

>>> import locale 
>>> locale.setlocale(locale.LC_ALL, 'sv_SE.utf8') 
'sv_SE.utf8' 
>>> import datetime 
>>> 
>>> data = ['January 20 1999', 'March 4 2010', 'June 11 1819'] 
>>> for item in data: 
...  print datetime.datetime.strptime(item, '%B %d %Y') 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/usr/lib/python2.6/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data 'January 20 1999' does not match format '%B %d %Y' 

ここでは、フォーマット試合をしていても、それはそれはないと主張していることがわかります。それは、月の名前が一致しないためです。スウェーデンのロケール名に変更し、それが再び動作します:

>>> import locale 
>>> locale.setlocale(locale.LC_ALL, 'sv_SE.utf8') 
'sv_SE.utf8' 
>>> import datetime 
>>> 
>>> data = ['Januari 20 1999', 'Mars 4 2010', 'Juni 11 1819'] 
>>> for item in data: 
...  print datetime.datetime.strptime(item, '%B %d %Y') 
... 
1999-01-20 00:00:00 
2010-03-04 00:00:00 
1819-06-11 00:00:00 

(あなたがその特定のロケールがインストールされている必要があるため上記のロケール「sv_SE.utf8」は、あなたのために動作しない場合があるので注意してください、どれを表示するには。 Unixマシンにインストールされていることを、コマンドラインから次のコマンドを実行します。

$ locale -a 
C 
en_AG 
en_AU.utf8 
en_BW.utf8 
en_CA.utf8 
en_DK.utf8 
en_GB.utf8 
en_HK.utf8 
en_IE.utf8 
en_IN 
en_NG 
en_NZ.utf8 
en_PH.utf8 
en_SG.utf8 
en_US.utf8 
en_ZA.utf8 
en_ZW.utf8 
POSIX 
sv_FI.utf8 
sv_SE.utf8 

+0

あなたの助けを借りて最終的にわかったおかげで、私は自分のループが継続するにつれて、それが異なる言語で動作する可能性があることに気づきませんでした。そして、ループの次の要素に到達するたびに、私の間違って、そのちょうど考え。とにかく私は本当にあなたの助けに感謝します。ありがとう – nabizan

0

かなり奇妙なしかし...同じ実行ロケールでは、通常は変更されません。しかし、あなたのプログラムがこれを続けていれば、コードがループに入るたびに(setlocale)呼び出すことができます(醜い解決策です)。

関連する問題