9

私は次のような入力形式で正常に動作する次のコードを持ってい{Year}/{Month}ます1994/02

サンプルコードはこちら

>>> import dateutil.parser as dtp
>>> dtp.parse('1994/01')
datetime.datetime(1994, 1, 29, 0, 0)
>>> dtp.parse('1994/03')
datetime.datetime(1994, 3, 29, 0, 0)
>>> dtp.parse('1994/02')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/antony/.virtualenvs/comp-invest/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/antony/.virtualenvs/comp-invest/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

ご覧のとおり、コードは と で正常に動作1994/01し ますが、これは閏年と関係がありますか? で1994/03失敗します。1994/02しかし、もっと重要なのは、この問題を回避してコードを再び機能させるにはどうすればよいでしょうか?

ありがとう

4

2 に答える 2

12

dtp.parse行方不明の日を現在の日付で埋めています。2013/01/29にコードを実行しましたが、29日目は2月には存在しません(つまり、1994/02/29)。

代わりにこれを使用してください:

dtp.parse('1994/01'+'/01')

コードがいつ実行されるかに関係なく、一貫した結果(月の最初の日)が得られます。

于 2013-01-30T01:56:06.170 に答える
3

これは、修正された dateutil のバグでした。バージョン 2.5.0 以降では、この問題はなくなりました。

default以前のバージョンを使用する必要がある場合、物事を処理する「正しい」方法は、パラメーターを指定することだと思います。

from dateutil.parser import parse
from datetime import datetime, date

# First of the current month, at midnight.
default_date = datetime.combine(date.today(), datetime.min.time()).replace(day=1)
dt = parse('1994/01', default=default_date)

これは、現在の日ではなく、月の 1 日にデフォルト設定されます。

于 2016-03-25T19:28:34.803 に答える