如何在 Python 中获取周数?
- 2025-01-09 08:47:00
- admin 原创
- 118
问题描述:
如何使用 Python 找出当前年份 6 月 16 日(wk24)是第几周?
解决方案 1:
datetime.date
有一个isocalendar()
方法,返回一个包含日历周的元组:
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar()[1]
24
datetime.date.isocalendar()是一个实例方法,返回一个包含给定日期实例的年份、周数和星期几的元组。
在 Python 3.9+ 中,isocalendar()
返回一个带有字段的命名元组year
,week
和,weekday
这意味着您可以使用命名属性明确访问周数:
>>> import datetime
>>> datetime.date(2010, 6, 16).isocalendar().week
24
解决方案 2:
您可以直接从日期时间中获取周数作为字符串。
>>> 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来自:datetime — 基本日期和时间类型 — Python 3.7.3 文档
我从这里发现了这一点。它在 Python 2.7.6 中对我有用
解决方案 3:
我相信date.isocalendar()
这就是答案。本文解释了 ISO 8601 日历背后的数学原理。查看Python 文档datetime 页面的 date.isocalendar() 部分。
>>> dt = datetime.date(2010, 6, 16)
>>> wk = dt.isocalendar()[1]
24
.isocalendar() 返回一个三元组,即 (year, wk num, wk day)。dt.isocalendar()[0]
返回年份,dt.isocalendar()[1]
返回周数,dt.isocalendar()[2]
返回星期几。非常简单。
解决方案 4:
有很多种星期编号系统。以下是最常见的系统,并附有代码示例:
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)
解决方案 5:
这是另一个选择:
import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime(d, '%U'))
打印24
。
参见: http: //docs.python.org/library/datetime.html#strftime-and-strptime-behavior
解决方案 6:
其他人建议的 ISO 周是个不错的选择,但可能不符合您的需求。它假设每周从星期一开始,这导致年初和年末出现一些有趣的异常现象。
如果您更愿意使用这样的定义:第 1 周始终是 1 月 1 日至 1 月 7 日,而不管是星期几,请使用如下推导方式:
>>> testdate=datetime.datetime(2010,6,16)
>>> print(((testdate - datetime.datetime(testdate.year,1,1)).days // 7) + 1)
24
解决方案 7:
通常获取当前周数(从周日开始):
from datetime import *
today = datetime.today()
print today.strftime("%U")
解决方案 8:
要获取一年中瞬时周数的整数值,请尝试:
import datetime
datetime.datetime.utcnow().isocalendar()[1]
解决方案 9:
我发现这些是获取周数的最快方法;所有的变体。
from datetime import datetime
dt = datetime(2021, 1, 3) # Date is January 3rd 2021 (Sunday), year starts with Friday
dt.strftime("%W") # '00'; Monday is considered first day of week, Sunday is the last day of the week which started in the previous year
dt.strftime("%U") # '01'; Sunday is considered first day of week
dt.strftime("%V") # '53'; ISO week number; result is '53' since there is no Thursday in this year's part of the week
%V
可以在 Python 文档中找到进一步的说明:
ISO 年份由 52 或 53 个完整星期组成,其中一周从星期一开始,到星期日结束。ISO 年份的第一周是一年中第一个(公历)日历周,其中包含星期四。这被称为第 1 周,该星期四的 ISO 年份与公历年份相同。
https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar
注意:请记住返回值是一个字符串,因此int
如果需要数字,请将结果传递给构造函数。
解决方案 10:
如果您只全面使用等历周数,则以下内容应该足够了:
import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]
这将检索 isocalendar 返回的元组的第二个成员作为我们的周数。
但是,如果您要使用处理公历的日期函数,则单独的 isocalendar 将不起作用!请看以下示例:
import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]
这里的字符串表示返回 2014 年第一周的星期一作为我们的日期。当我们使用 isocalendar 检索这里的周数时,我们期望得到相同的周数,但我们没有得到。相反,我们得到的是周数 2。为什么?
公历中的第 1 周是包含星期一的第一周。等历中的第 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
解决方案 11:
本星期:
import datetime as dt
dt.date.today().isocalendar().week
对于任何其他周,today()
用替代date(year, month, day)
。
祝你过得愉快week
。
解决方案 12:
我将讨论概括为两个步骤:
将原始格式转换为
datetime
对象。datetime
使用对象或对象的函数date
来计算周数。
热身
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()
来准备每周报告,尤其是在Christmas-New Year
购物季节。
解决方案 13:
您可以尝试如下 %W 指令:
d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))
'%W':一年中的周数(星期一为一周的第一天),以十进制数表示。新年中第一个星期一之前的所有日子都被视为第 0 周。(00、01、...、53)
解决方案 14:
对于 pandas 用户,如果您想获取一列周数:
df['weekofyear'] = df['Date'].dt.week
解决方案 15:
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
解决方案 16:
假设您需要将一周与当天的年份组合成一个字符串。
import datetime
year,week = datetime.date.today().isocalendar()[:2]
week_of_the_year = f"{year}-{week}"
print(week_of_the_year)
你可能会得到类似2021-28 的结果
解决方案 17:
如果您想更改一周的第一天,您可以使用日历模块。
import calendar
import datetime
calendar.setfirstweekday(calendar.WEDNESDAY)
isodate = datetime.datetime.strptime(sweek,"%Y-%m-%d").isocalendar()
week_of_year = isodate[1]
例如,计算从星期三开始的一周的冲刺次数:
def calculate_sprint(sweek):
calendar.setfirstweekday(calendar.WEDNESDAY)
isodate=datetime.datetime.strptime(sweek,"%Y-%m-%d").isocalendar()
return "{year}-{month}".format(year=isodate[0], month=isodate[1])
calculate_sprint('2021-01-01')
>>>'2020-53'
解决方案 18:
我们遇到了类似的问题,我们想出了这个逻辑,我已经测试了一年的测试用例并且全部通过
import datetime
def week_of_month(dt):
first_day = dt.replace(day=1)
dom = dt.day
if first_day.weekday() == 6:
adjusted_dom = dom
else:
adjusted_dom = dom + first_day.weekday()
if adjusted_dom % 7 == 0 and first_day.weekday() != 6:
value = adjusted_dom / 7.0 + 1
elif first_day.weekday() == 6 and adjusted_dom % 7 == 0 and adjusted_dom == 7:
value = 1
else:
value = int(ceil(adjusted_dom / 7.0))
return int(value)
year = 2020
month = 01
date = 01
date_value = datetime.datetime(year, month, date).date()
no = week_of_month(date_value)
解决方案 19:
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 ,
So hurryup.............!!!")
解决方案 20:
已经有很多答案了,但我想补充一些。
如果您需要以年/周样式显示星期(例如 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