web-dev-qa-db-ja.com

Pythonで週番号を取得する方法

Pythonで6月16日の現在の週番号(wk24)を調べる方法は?

269
Gerry

datetime.dateにはisocalendar()メソッドがあります。このメソッドは、カレンダーの週を含むTupleを返します。

>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24

datetime.date.isocalendar() は、与えられた日付インスタンスの年、週番号、平日をそれぞれ順番に含むタプルを返すインスタンスメソッドです。

331
Horst Gutmann

週番号は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

from: datetime - 基本的な日付と時刻の型 - Python 3.7.3ドキュメント

私は ここ からそれについて知りました。それは私にとってPython 2.7.6でうまくいきました

78
jotacor

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]は平日を返します。可能な限り簡単。

69

これは別の選択肢です:

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

26
Bart Kiers

他の人によって提案されたISOの週は良いものですが、それはあなたのニーズに合わないかもしれません。毎週月曜日から始まることを前提としています。これは、年の初めと終わりにいくつかの興味深い異常を引き起こします。

曜日に関係なく、週1が常に1月1日から1月7日であるという定義を使用する場合は、次のような派生を使用します。

>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
19
Mark Ransom

現在の週番号を取得するには(日曜日から始まります):

from datetime import *
today = datetime.today()
print today.strftime("%U")
16
Chaggster

その瞬間の週の整数値として、

import datetime
datetime.datetime.utcnow().isocalendar()[1]
12
user2099484

あなたが全面的に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
8

以下のように%Wディレクティブを試すことができます。

d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))

'%W':10進数で表した年の週番号(週の最初の日として月曜日)。最初の月曜日より前の新しい年のすべての日は、第0週と見なされます。(00、01、...、53)

6
Tung Nguyen

datetime.datetime.isocalendar を見てください。

5
miles82

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
Kevin

議論を2つのステップに要約します。

  1. 生のフォーマットをdatetimeオブジェクトに変換します。
  2. 週番号を計算するには、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()を使用して週次レポートを作成することが多くなります。

2
Yuchao Jiang

週番号付けには多くのシステムがあります。以下は、コード例を単純に入れた最も一般的なシステムです。

  • 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)
    
  • MMWR(CDC):最初の週は日曜日から始まり、1月4日を含む必要があります。この番号付けシステム専用に epiweeks パッケージを作成しました。次に例を示します。
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)
    
0
dralshehri
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.............!!!") 
0