2017-03-23 7 views
0

12月の月にエラーが発生しました。月の最後の日をPythonで取得する

ValueError: month must be in 1..12

def last_day_of_month(ds): 
    cur_ds = datetime.strptime(ds, '%Y-%m-%d') 
    next_month = datetime(year=cur_ds.year, month=cur_ds.month+1, day=1) 
    last_day_month = next_month - timedelta(days=1) 
    return datetime.strftime(last_day_month, '%Y-%m-%d') 

print last_day_of_month('2016-12-01') 
+3

明らかに、月が12月の場合、 'month = cur_ds.month + 1'は13になるでしょうか?そして、間違いが言うように、明らかに13は許容される月ではありませんか? –

+0

はい、条件を使用する以外にも処理できる方法はありますか – paddu

+0

あなたは '%12'を使うことができますか? –

答えて

2

あなたは、あなたがそれを修正する方法を見つけなければならない13の月とdatetimeをすることはできません。簡単な解決策は、インクリメント月は余分な年に変換することです:

# Reduce 12 to 1, 0 and all other #s to 0, # 
extrayear, month = divmod(cur_ds.month, 12) 
# Add 1 or 0 to existing year, add one to month (which was reduced to 0-11) 
next_month = datetime(year=cur_ds.year + extrayear, month=month + 1, day=1) 
+0

ありがとうございます。それは実際に問題を直接解決してくれる – paddu

0

あなたはそれ13作り、next_monthを取得するために1を加算し、その後、現在の月のように12に渡してい。 12ケースを確認して、代わりにmonth=1と設定してください。

2

3行目month=cur_ds.month+1には、13th月が与えられていますが、これは無効です。特定の月の最終日を計算する場合は、カレンダーライブラリから月の範囲を使用することもできます。

>>import calendar 
>>year, month = 2016, 12 
>>calendar.monthrange(year, month)[1] 
31 
+1

Oohです。私は承認する。 Upvoted。私はいつも[calendarモジュール(https://docs.python.org/3/library/calendar.html)も存在することを忘れています。 – ShadowRanger

+0

lolええ、それは私の日常生活です。何かを書いて、そこにモジュールがあることを認識してください:/ – umutto

+1

悪化する可能性があります。すでに存在する可能性がありますが、従来のコードベースでは使用できません。または、あなたがそれを書き終えてから1ヵ月後に作成されます。私は両方を持っていました。なぜなら、2.7のコードベースがスタックトレースを安価にキャッシュできる必要があったからです(デバッグシナリオが出たら後で出力することができます)。私は基本的に3.5リリースの前に['traceback.StackSummary(lookup_lines = False)'](https://docs.python.org/3/library/traceback.html#traceback.StackSummary)を発明しました(もちろん、コードベースが2.7で、3.xに移行するにはあまりにも痛いので、 'StackSummary'を使用してください)。一口... :-) – ShadowRanger

関連する問題