问题:如何在Python中获取星期数?
如何使用Python找出6月16日(wk24)当年的星期几?
How to find out what week number is current year on June 16th (wk24) with Python?
回答 0
datetime.date
有一个isocalendar()
方法,该方法返回包含日历周的元组:
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24
datetime.date.isocalendar()是一种实例方法,该方法返回给定日期实例的元组,该元组按各自的顺序包含年,周号和周日。
datetime.date
has a isocalendar()
method, which returns a tuple containing the calendar week:
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24
datetime.date.isocalendar() is an instance-method returning a tuple containing year, weeknumber and weekday in respective order for the given date instance.
回答 1
您可以直接从日期时间获取星期数作为字符串。
>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'
您还可以通过更改以下strftime
参数来获得一年中星期几的不同“类型” :
%U
– 一年中的周号(星期日为一周的第一天),以零填充的十进制数表示。在第一个星期天之前的新的一年的所有天都被认为是在本周0示例:00,01,…,53
%W
-一年中的星期数(星期一为一周的第一天),以十进制数表示。第一个星期一之前的新的一年中的所有天都视为在第0周。例如:00,01,…,53
[…]
(在Python 3.6中添加,并反向移植到某些发行版的Python 2.7中。)为方便起见,还包含了C89标准不需要的其他一些指令。这些参数都对应于ISO 8601日期值。当与该strftime()
方法一起使用时,可能并非在所有平台上都可用。
[…]
%V
– ISO 8601星期与周一的十进制数作为一周的第一天。周01是包含在1月4例子的一周:01,02,…,53
from:datetime-基本日期和时间类型-Python 3.7.3文档
我从这里找到了。它在Python 2.7.6中为我工作
You can get the week number directly from datetime as string.
>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'
Also you can get different “types” of the week number of the year changing the strftime
parameter for:
%U
– Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. Examples: 00, 01, …, 53
%W
– Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. Examples: 00, 01, …, 53
[…]
(Added in Python 3.6, backported to some distribution’s Python 2.7’s) Several additional directives not required by the C89 standard are included for convenience. These parameters all correspond to ISO 8601 date values. These may not be available on all platforms when used with the strftime()
method.
[…]
%V
– ISO 8601 week as a decimal number with Monday as the first day of the week. Week 01 is the week containing Jan 4. Examples: 01, 02, …, 53
from: datetime — Basic date and time types — Python 3.7.3 documentation
I’ve found out about it from here. It worked for me in Python 2.7.6
回答 2
我相信date.isocalendar()
这将是答案。本文介绍了ISO 8601日历背后的数学原理。查看Python文档的datetime页面的date.isocalendar()部分。
>>> dt = datetime.date(2010, 6, 16)
>>> wk = dt.isocalendar()[1]
24
.isocalendar()返回带有(年,周,周,日)的三元组。dt.isocalendar()[0]
返回年份,dt.isocalendar()[1]
返回星期数,dt.isocalendar()[2]
返回星期几。可以很简单。
I believe date.isocalendar()
is going to be the answer. This article explains the math behind ISO 8601 Calendar. Check out the date.isocalendar() portion of the datetime page of the Python documentation.
>>> dt = datetime.date(2010, 6, 16)
>>> wk = dt.isocalendar()[1]
24
.isocalendar() return a 3-tuple with (year, wk num, wk day). dt.isocalendar()[0]
returns the year,dt.isocalendar()[1]
returns the week number, dt.isocalendar()[2]
returns the week day. Simple as can be.
回答 3
回答 4
其他人建议的ISO周是不错的一周,但它可能不符合您的需求。假设每个星期都从星期一开始,这会导致年初和年底出现一些有趣的异常情况。
如果您想使用第1周始终为1月1日至1月7日的定义,而不管一周中的星期几,请使用类似以下的推导:
>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
The ISO week suggested by others is a good one, but it might not fit your needs. It assumes each week begins with a Monday, which leads to some interesting anomalies at the beginning and end of the year.
If you’d rather use a definition that says week 1 is always January 1 through January 7, regardless of the day of the week, use a derivation like this:
>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
回答 5
通常要获取当前的星期数(从星期日开始):
from datetime import *
today = datetime.today()
print today.strftime("%U")
Generally to get the current week number (starts from Sunday):
from datetime import *
today = datetime.today()
print today.strftime("%U")
回答 6
对于一年中瞬时周的整数值,请尝试:
import datetime
datetime.datetime.utcnow().isocalendar()[1]
For the integer value of the instantaneous week of the year try:
import datetime
datetime.datetime.utcnow().isocalendar()[1]
回答 7
有许多用于周编号的系统。以下是简单地与代码示例一起放置的最常见系统:
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程序包(也支持ISO系统)。这是一个例子:
>>> from datetime import date
>>> from epiweeks import Week
>>> Week.fromdate(date(2014, 12, 29))
(2014, 53)
There are many systems for week numbering. The following are the most common systems simply put with code examples:
ISO: First week starts with Monday and must contain the January 4th. The ISO calendar is already implemented in Python:
>>> from datetime import date
>>> date(2014, 12, 29).isocalendar()[:2]
(2015, 1)
North American: First week starts with Sunday and must contain the January 1st. The following code is my modified version of Python’s ISO calendar implementation for the North American system:
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): First week starts with Sunday and must contain the January 4th. I created the epiweeks package specifically for this numbering system (also has support for the ISO system). Here is an example:
>>> from datetime import date
>>> from epiweeks import Week
>>> Week.fromdate(date(2014, 12, 29))
(2014, 53)
回答 8
如果您仅使用等周日历号,则以下内容就足够了:
import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]
这将检索isocalendar返回的元组的第二个成员,作为我们的星期数。
但是,如果您要使用公历中处理的日期函数,则仅等距日历无法正常工作!请看以下示例:
import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]
此处的字符串表示返回2014年第一周的星期一作为我们的日期。当我们使用isocalendar在此处检索星期数时,我们希望可以返回相同的星期数,但事实并非如此。相反,我们得到的周数为2。为什么?
阳历的第一周是包含星期一的第一周。等值线的第1周是包含星期四的第一周。2014年初的不完整一周包含一个星期四,因此这是等距日历的第1周,date
第2周。
如果要获得公历周,我们将需要从等距转换为公历。这是个简单的功能,可以解决问题。
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
If you are only using the isocalendar week number across the board the following should be sufficient:
import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]
This retrieves the second member of the tuple returned by isocalendar for our week number.
However, if you are going to be using date functions that deal in the Gregorian calendar, isocalendar alone will not work! Take the following example:
import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]
The string here says to return the Monday of the first week in 2014 as our date. When we use isocalendar to retrieve the week number here, we would expect to get the same week number back, but we don’t. Instead we get a week number of 2. Why?
Week 1 in the Gregorian calendar is the first week containing a Monday. Week 1 in the isocalendar is the first week containing a Thursday. The partial week at the beginning of 2014 contains a Thursday, so this is week 1 by the isocalendar, and making date
week 2.
If we want to get the Gregorian week, we will need to convert from the isocalendar to the Gregorian. Here is a simple function that does the trick.
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
回答 9
您可以尝试使用%W指令,如下所示:
d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))
‘%W’:一年中的第几周(星期一为一周的第一天),以十进制数表示。第一个星期一之前的新的一年中的所有天都视为在第0周。(00,01,…,53)
You can try %W directive as below:
d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))
‘%W’: Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. (00, 01, …, 53)
回答 10
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
isocalendar() returns incorrect year and weeknumber values for some dates:
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
Compare with Mark Ransom’s approach:
>>> 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
回答 11
我将讨论概括为两个步骤:
- 将原始格式转换为
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)
“`
第一步
要手动生成datetime
对象,我们可以使用datetime.datetime(2017,5,3)
或datetime.datetime.now()
。
但是实际上,我们通常需要解析一个现有的字符串。我们可以使用strptime
函数,例如datetime.strptime('2017-5-3','%Y-%m-%d')
您必须指定的格式。有关不同格式代码的详细信息,请参见官方文档中。
或者,更方便的方法是使用dateparse模块。例子有dateparser.parse('16 Jun 2010')
,dateparser.parse('12/2/12')
或dateparser.parse('2017-5-3')
以上两种方法将返回一个datetime
对象。
第二步
使用获得的 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()
编写每周报告,尤其是在“圣诞节-新年”购物季节。
I summarize the discussion to two steps:
- Convert the raw format to a
datetime
object.
- Use the function of a
datetime
object or a date
object to calculate the week number.
Warm up
“`python
from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)
“`
1st step
To manually generate a datetime
object, we can use datetime.datetime(2017,5,3)
or datetime.datetime.now()
.
But in reality, we usually need to parse an existing string. we can use strptime
function, such as datetime.strptime('2017-5-3','%Y-%m-%d')
in which you have to specific the format. Detail of different format code can be found in the official documentation.
Alternatively, a more convenient way is to use dateparse module. Examples are dateparser.parse('16 Jun 2010')
, dateparser.parse('12/2/12')
or dateparser.parse('2017-5-3')
The above two approaches will return a datetime
object.
2nd step
Use the obtained datetime
object to call strptime(format)
. For example,
“`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.
“`
It’s very tricky to decide which format to use. A better way is to get a date
object to call isocalendar()
. For example,
“`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
“`
In reality, you will be more likely to use date.isocalendar()
to prepare a weekly report, especially in the “Christmas-New Year” shopping season.
回答 12
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.............!!!")
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.............!!!")
回答 13
已经给出了很多答案,但是id喜欢添加到它们中。
如果您需要将星期显示为年/周样式(例如1953年-2019年第53周,2001年-2020年第1周等),则可以执行以下操作:
import datetime
year = datetime.datetime.now()
week_num = datetime.date(year.year, year.month, year.day).strftime("%V")
long_week_num = str(year.year)[0:2] + str(week_num)
这将需要当前的年和周,而在撰写本文时,long_week_num将是:
>>> 2006
A lot of answers have been given, but id like to add to them.
If you need the week to display as a year/week style (ex. 1953 – week 53 of 2019, 2001 – week 1 of 2020 etc.), you can do this:
import datetime
year = datetime.datetime.now()
week_num = datetime.date(year.year, year.month, year.day).strftime("%V")
long_week_num = str(year.year)[0:2] + str(week_num)
It will take the current year and week, and long_week_num in the day of writing this will be:
>>> 2006