3

私はこのようなコードを持っています:

import time
from datetime import date
startyear = raw_input("start year: ")
startmonth = raw_input("start month: ")
startday = raw_input("start day: ")
endyear = raw_input("end year: ")
endmonth = raw_input("end month: ")
endday = raw_input("end day: ")

startdate = date(int(startyear), int(startmonth), int(startday))
while startdate < date(int(endyear), int(endmonth), int(endday)):
    print startdate
    startdate = startdate.replace(day=startdate.day + 1)

このコードが行うことは次の
とおりです。 1.手動入力で開始日と終了日を取得します
2.それらの間の日付のリストを生成します

しかし、問題は、たとえば次のように日付を設定すると
startdate: 2012-10-28
enddate: 2012-11-4
、出力が次のようになることです。

2012-10-28
2012-10-29
2012-10-30
2012-10-31
ValueError: day is out of range for month

出力を次のようにしたい:

2012-10-28
2012-10-29
2012-10-30
2012-10-31
2012-11-01
2012-11-02
2012-11-03
2012-11-04

だから私は日付が月を通過することを望みます。助言がありますか?どんな助けでも本当に素晴らしいでしょう。

4

2 に答える 2

7

の代わりに、 ...startdate.replace()を使用する必要があります。timedelta

from datetime import date, timedelta
# Get input here...
while startdate < date(int(endyear), int(endmonth), int(endday)):
    print startdate
    startdate += timedelta(days=1)
于 2012-11-24T09:02:37.143 に答える
7

このような場合に非常に便利なpython-dateutilというモジュールがあります。

from datetime import datetime
from dateutil.rrule import rrule, DAILY

list(rrule(DAILY, dtstart=datetime(2012, 11, 24), until=datetime(2012,11,30)))
# [datetime.datetime(2012, 11, 24, 0, 0), datetime.datetime(2012, 11, 25, 0, 0), datetime.datetime(2012, 11, 26, 0, 0), datetime.datetime(2012, 11, 27, 0, 0), datetime.datetime(2012, 11, 28, 0, 0), datetime.datetime(2012, 11, 29, 0, 0), datetime.datetime(2012, 11, 30, 0, 0)]

また、他のオプションもあります。たとえば、曜日ごとに指定できます (稼働週の MO、TU、WE、TH、FR のみを含めると便利です)。

from dateutil.rrule import MO, WE
list(rrule(DAILY, byweekday=[MO, WE], dtstart=datetime(2012, 11, 24), until=datetime(2012,11,30))
# [datetime.datetime(2012, 11, 26, 0, 0), datetime.datetime(2012, 11, 28, 0, 0)]
于 2012-11-24T10:38:02.773 に答える