Pythonで6月16日の現在の週番号(wk24)を調べる方法は?
datetime.date
にはisocalendar()
メソッドがあります。このメソッドは、カレンダーの週を含むTupleを返します。
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24
datetime.date.isocalendar() は、与えられた日付インスタンスの年、週番号、平日をそれぞれ順番に含むタプルを返すインスタンスメソッドです。
週番号はdatetimeから直接文字列として取得できます。
>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'
また、以下のようにstrftime
パラメータを変更して、年の週番号のさまざまな「タイプ」を取得できます。
%U
- 年の週番号(週の最初の日としての日曜日)、ゼロ埋めの10進数として。最初の日曜日に先行する新年のすべての日は、第0週と見なされます。例:00、01、…、53
%W
- 年の週番号(月曜日を週の初日)、10進数で表したもの。最初の月曜日より前の新しい年のすべての日は、0週目と見なされます。例:00、01、…、53[...]
(Python 3.6で追加され、一部のディストリビューションのPython 2.7にバックポートされました。)C89標準では必要とされないいくつかの追加ディレクティブが便宜上含まれています。これらのパラメータはすべてISO 8601の日付値に対応しています。 これらを
strftime()
メソッドと一緒に使用した場合、すべてのプラットフォームで利用できるわけではありません。[...]
%V
- ISO 8601週で、月曜日を週の最初の日とする10進数。 01週は1月4日を含む週です。例:01、02、…、53
私は ここ からそれについて知りました。それは私にとってPython 2.7.6でうまくいきました
date.isocalendar()
が答えになると思います。 この記事 はISO 8601カレンダーの背後にある数学を説明しています。 Pythonのドキュメントの datetime page のdate.isocalendar()の部分を調べてください。
>>> dt = datetime.date(2010, 6, 16)
>>> wk = dt.isocalendar()[1]
24
.isocalendar()は(year、wk num、wk day)を使って3タプルを返します。 dt.isocalendar()[0]
は年を返し、dt.isocalendar()[1]
は週番号を、dt.isocalendar()[2]
は平日を返します。可能な限り簡単。
これは別の選択肢です:
import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime("%U", d))
これは24
を出力します。
参照してください: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior
他の人によって提案されたISOの週は良いものですが、それはあなたのニーズに合わないかもしれません。毎週月曜日から始まることを前提としています。これは、年の初めと終わりにいくつかの興味深い異常を引き起こします。
曜日に関係なく、週1が常に1月1日から1月7日であるという定義を使用する場合は、次のような派生を使用します。
>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
現在の週番号を取得するには(日曜日から始まります):
from datetime import *
today = datetime.today()
print today.strftime("%U")
その瞬間の週の整数値として、
import datetime
datetime.datetime.utcnow().isocalendar()[1]
あなたが全面的にisocalendar週番号だけを使っているならば、以下は十分であるべきです:
import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]
これは、週番号に対してisocalendarによって返されたTupleの2番目のメンバーを取得します。
ただし、グレゴリオ暦で扱う日付関数を使用しようとしている場合、isocalendarだけでは機能しません。次の例を見てください。
import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]
ここの文字列は、2014年の最初の週の月曜日を日付として返すことを示しています。ここで週番号を取得するためにisocalendarを使用すると、同じ週番号が返されると予想されますが、そうではありません。代わりに、週数は2になります。なぜでしょうか。
グレゴリオ暦の第1週は、月曜日が含まれる最初の週です。 isocalendarの第1週は木曜日を含む最初の週です。 2014年の初めの部分週には木曜日が含まれているので、これはisocalendarによる1週目で、date
週2になります。
グレゴリオ暦の週を取得したい場合は、isocalendarからGregorianに変換する必要があります。これがトリックをする簡単な関数です。
import datetime
def gregorian_week(date):
# The isocalendar week for this date
iso_week = date.isocalendar()[1]
# The baseline Gregorian date for the beginning of our date's year
base_greg = datetime.datetime.strptime('%d-1-1' % date.year, "%Y-%W-%w")
# If the isocalendar week for this date is not 1, we need to
# decrement the iso_week by 1 to get the Gregorian week number
return iso_week if base_greg.isocalendar()[1] == 1 else iso_week - 1
以下のように%Wディレクティブを試すことができます。
d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))
'%W':10進数で表した年の週番号(週の最初の日として月曜日)。最初の月曜日より前の新しい年のすべての日は、第0週と見なされます。(00、01、...、53)
datetime.datetime.isocalendar を見てください。
isocalendar()は、一部の日付に対して誤った年と週番号の値を返します。
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime as dt
>>> myDateTime = dt.datetime.strptime("20141229T000000.000Z",'%Y%m%dT%H%M%S.%fZ')
>>> yr,weekNumber,weekDay = myDateTime.isocalendar()
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2015, weekNumber is 1
Mark Ransomのアプローチと比較してください。
>>> yr = myDateTime.year
>>> weekNumber = ((myDateTime - dt.datetime(yr,1,1)).days/7) + 1
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2014, weekNumber is 52
議論を2つのステップに要約します。
datetime
オブジェクトに変換します。datetime
オブジェクトまたはdate
オブジェクトの関数を使用します。ウォームアップ
python
from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)
`` `
第1ステップ
手動でdatetime
オブジェクトを生成するために、datetime.datetime(2017,5,3)
またはdatetime.datetime.now()
を使うことができます。
しかし実際には、既存の文字列を解析する必要があります。 datetime.strptime('2017-5-3','%Y-%m-%d')
のようにフォーマットを特定する必要があるstrptime
関数を使うことができます。異なるフォーマットコードの詳細は 公式ドキュメント にあります。
あるいは、もっと便利な方法は dateparse moduleを使うことです。例はdateparser.parse('16 Jun 2010')
、dateparser.parse('12/2/12')
またはdateparser.parse('2017-5-3')
です。
上記の2つのアプローチはdatetime
オブジェクトを返します。
第2ステップ
取得したdatetime
オブジェクトを使用してstrptime(format)
を呼び出します。例えば、
python
dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object. This day is Sunday
print(dt.strftime("%W")) # '00' Monday as the 1st day of the week. All days in a new year preceding the 1st Monday are considered to be in week 0.
print(dt.strftime("%U")) # '01' Sunday as the 1st day of the week. All days in a new year preceding the 1st Sunday are considered to be in week 0.
print(dt.strftime("%V")) # '52' Monday as the 1st day of the week. Week 01 is the week containing Jan 4.
`` `
どの形式を使用するかを決めるのはとても難しいです。もっと良い方法はdate
オブジェクトからisocalendar()
を呼び出すことです。例えば、
python
dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object
d = dt.date() # convert to a date object. equivalent to d = date(2017,1,1), but date.strptime() don't have the parse function
year, week, weekday = d.isocalendar()
print(year, week, weekday) # (2016,52,7) in the ISO standard
`` `
実際には、特に "クリスマス - 新年"のショッピングシーズンでは、date.isocalendar()
を使用して週次レポートを作成することが多くなります。
週番号付けには多くのシステムがあります。以下は、コード例を単純に入れた最も一般的なシステムです。
ISO:最初の週は月曜日から始まり、1月4日を含む必要があります。 ISOカレンダーは既にPythonで実装されています。
>>> from datetime import date
>>> date(2014, 12, 29).isocalendar()[:2]
(2015, 1)
北米:最初の週は日曜日から始まり、1月1日を含む必要があります。次のコードは、北米システム用のPythonのISOカレンダー実装の修正バージョンです。
from datetime import date
def week_from_date(date_object):
date_ordinal = date_object.toordinal()
year = date_object.year
week = ((date_ordinal - _week1_start_ordinal(year)) // 7) + 1
if week >= 52:
if date_ordinal >= _week1_start_ordinal(year + 1):
year += 1
week = 1
return year, week
def _week1_start_ordinal(year):
jan1 = date(year, 1, 1)
jan1_ordinal = jan1.toordinal()
jan1_weekday = jan1.weekday()
week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
return week1_start_ordinal
>>> from datetime import date
>>> week_from_date(date(2014, 12, 29))
(2015, 1)
>>> from datetime import date
>>> from epiweeks import Week
>>> Week.fromdate(date(2014, 12, 29))
(2014, 53)
userInput = input ("Please enter project deadline date (dd/mm/yyyy/): ")
import datetime
currentDate = datetime.datetime.today()
testVar = datetime.datetime.strptime(userInput ,"%d/%b/%Y").date()
remainDays = testVar - currentDate.date()
remainWeeks = (remainDays.days / 7.0) + 1
print ("Please pay attention for deadline of project X in days and weeks are : " ,(remainDays) , "and" ,(remainWeeks) , "Weeks ,\nSo hurryup.............!!!")