開始日が与えられた場合、Pythonを使用して「営業週」が何週間経過したかをどのように判断できますか?正解が得られないので、7で割ることはできません。
例として、2012年8月1日の開始日から現在の日付(2012年8月13日)までの3週間が出力されます。
私は基本的に、フットボールシーズンの初めから、今週(整数)が何であるかを理解しようとしています。
Pythonのdatetimeモジュールをいじってみましたが、役に立ちませんでした。
datetime.weekday、datetime.isoweekdayを使用して現在の曜日を取得するか、より完全なdatetime.isocalendarを使用して現在の週を取得し、それらをオフセットとして使用して、整列された差を計算してみてください。
したがって、次のような関数を使用できます。
def week_difference(start, end):
assert start <= end
start_year, start_week, start_dayofweek = start.isocalendar()
end_year, end_week, end_dayofweek = end.isocalendar()
return ((end_year - start_year) * 52) - start_week + end_week
このような使用法で:
import datetime as dt
# same week
In [1]: week_difference(dt.datetime(2012, 8, 1), dt.datetime(2012, 8, 1))
Out[1]: 0
# your example (see note below)
In [2]: week_difference(dt.datetime(2012, 8, 1), dt.datetime(2012, 8, 13))
Out[2]: 2
# across years
In [3]: week_difference(dt.datetime(2011, 8, 1), dt.datetime(2012, 8, 13))
Out[3]: 54
# year boundary: second last business week of 2011, to first business week of 2012
# which is the same business week as the last business week of 2011
In [4]: week_difference(dt.datetime(2011, 12, 20), dt.datetime(2012, 1, 1))
Out[4]: 1
In [5]: week_difference(dt.datetime(2011, 12, 18), dt.datetime(2012, 1, 1))
Out[5]: 2
1
週の差がどうあるべきかという選択したセマンティクスに応じて、週の出力に追加できます。
日時オブジェクトを取得すると...
import datetime
today = datetime.datetime.now()
start = datetime.datetime(2012, 9, 5)
...さらにアイソカレンダーを使用できます...
today.isocalendar()
>>> (2012, 33, 1)
start.isocalendar()
>>> (2012, 36, 3)
この3タプルは、年、年の週、および曜日を返します。1年だけを気にする場合は、「その年の週」の値を単純に引くことができます(ここでは1つずれている可能性があります)。それ以外の場合は、その年を関与させる必要があります。
一発ギャグ:
datetime.date.isocalendar(datetime.date.today())[1] - datetime.date(2012, 8, 1).isocalendar()[1] + 1
私のワンライナーは年の境界を含むように拡張されました:
start_date = datetime.date(2012, 8, 1)
print ((datetime.date.isocalendar(datetime.date.today())[0]-datetime.date.isocalendar(start_date)[0])*52)+(datetime.date.isocalendar(datetime.date.today())[1]-datetime.date.isocalendar(start_date)[1])+1
>>> 3
注:start_dateが将来(今日から)の場合、この関数は引き続き負の値を返します。