5

開始日が与えられた場合、Pythonを使用して「営業週」が何週間経過したかをどのように判断できますか?正解が得られないので、7で割ることはできません。

例として、2012年8月1日の開始日から現在の日付(2012年8月13日)までの3週間が出力されます。

私は基本的に、フットボールシーズンの初めから、今週(整数)が何であるかを理解しようとしています。

Pythonのdatetimeモジュールをいじってみましたが、役に立ちませんでした。

4

4 に答える 4

7

datetime.weekdaydatetime.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週の差がどうあるべきかという選択したセマンティクスに応じて、週の出力に追加できます。

于 2012-08-14T02:18:55.037 に答える
2

日時オブジェクトを取得すると...

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つずれている可能性があります)。それ以外の場合は、その年を関与させる必要があります。

于 2012-08-14T02:30:12.563 に答える
0

一発ギャグ:

datetime.date.isocalendar(datetime.date.today())[1] - datetime.date(2012, 8, 1).isocalendar()[1] + 1
于 2012-08-14T02:36:22.307 に答える
0

私のワンライナーは年の境界を含むように拡張されました:

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が将来(今日から)の場合、この関数は引き続き負の値を返します。

于 2012-08-14T19:00:09.303 に答える