1

特定の日付について、次のルールに従って、その年の週番号を見つける必要があります。

  1. 週は日曜日に始まり、土曜日に終わります。
  2. 年の最初の週は、最初の週が 12 月に始まることを意味する場合でも、少なくとも月の 4 日以内に収まる限り、1 月の最初の土曜日に終了します。

同様の結果が返されることはわかっていdatetime.datetime.isocalendar()ますが、週は月曜日に始まります。このtime.strftime('%U',<tuple>)モジュールは、日曜日から始まる週の週番号を返しますが、年の最初の週を最初の土曜日で終わる週と見なします (1 月に最低 4 日あることを考慮しません)。上記の定義に従って週番号を見つけることができるモジュールはありますか? そうでなければ、誰かがオーバーロードする方法を提案できますかdatetime.isocalendar()

編集:次の方法を試していました

ステップ 1: 日曜日からの週を数え、4 日間の制限を考慮せずに、年の最初の週を見つけます (基本的に、最初の週には年の最初の水曜日が含まれている必要があります)。

使った

dt = datetime.date.today()
year = dt.year 
first_Sunday = datetime.datetime.strptime('%d-00-0' % year, '%Y-%U-%w').date()

ステップ 2: 得られた最初の週に最初の水曜日が含まれているかどうかを判断します。

しかし、何らかの奇妙な理由で、明らかに火曜日であることdatetime.datetime.strptime('2013-00-0', '%Y-%U-%w').date()が出力されています!!date(2013, 1, 1)

4

2 に答える 2

1

いつ下落するかはおおまかにわかっているため、最初の週を見つける最も簡単な方法は、線形検索を行うことです。与えられた規則により、週の終わりは 1 月 4 日以降の最初の土曜日になります。これは次の方法で見つけることができます。

def first_saturday(year):
     candidate = dt.datetime(year, 1, 4)
     day = dt.timedelta(days=1)
     while candidate.weekday() != 6:
         candidate += day
     return candidate

datecount必要に応じて、 に類似した関数を実装することで、これを少し読みやすくするitertools.countことができます。

first_saturday = next(day for day in 
   datecount(datetime(year, 1, 4), timedelta(days=1)) 
   if day.weekday() == 6)

そこから、開始の土曜日から 6 日を引いて、開始の日曜日を見つけます。次に、週数は次のようになります。

(arbitrary_day - first_sunday) // timedelta(days=7)

これはゼロからカウントされます。

特定の日がどの年に属しているかを調べるには、グレゴリオ暦の年、翌年、または前年の 3 つの可能性しかありません。あなたが興味を持っているのは、first_sunday(year) <= arbitrary_date.

于 2013-05-27T08:58:23.480 に答える