如何在Python中获取给定年份和日历周的所有日期?
假设你有一年“2017”和一周“13”。如何高效地(使用datetime或calendar之类的库)将与今年和日历周相对应的所有日期作为Python中的列表如何在Python中获取给定年份和日历周的所有日期?,python,datetime,calendar,Python,Datetime,Calendar,假设你有一年“2017”和一周“13”。如何高效地(使用datetime或calendar之类的库)将与今年和日历周相对应的所有日期作为Python中的列表 导入日期时间 def get_月(年:整数,工作日:整数): 开始=datetime.datetime(年=年,月=1,天=1) ''' 工作日更正: 资料来源:https://www.calendar-week.org/ “在欧洲,一年中的第一个日历周就是 包含新年的四天。” ''' 如果start.weekday()>=4: start
导入日期时间
def get_月(年:整数,工作日:整数):
开始=datetime.datetime(年=年,月=1,天=1)
'''
工作日更正:
资料来源:https://www.calendar-week.org/
“在欧洲,一年中的第一个日历周就是
包含新年的四天。”
'''
如果start.weekday()>=4:
start+=datetime.timedelta(天=7-start.weekday())
其他:
start-=datetime.timedelta(天=start.weekday())
开始+=datetime.timedelta(天=7*(工作日-1))
返回[start+datetime.timedelta(天=i)对于范围(0,7)内的i]
将返回datetime
-s的列表。要获取字符串表示形式,请执行以下操作:
print(列表(map(lambda x:str(x.date()),get_month(2017,2)))
不确定这是您想要的。我使用了日历
模块,这是我能做到的最好的一点,请告诉我:
import calendar
def get_week(y, w):
weeks = [
tuple(w)
for t in cal.yeardatescalendar(y) for month in t for w in month
if w[0].year == y
]
weeks = sorted(list(set(weeks)))
return list(weeks[w-1])
get_week(2017, 13)
输出:
[datetime.date(2017, 3, 27),
datetime.date(2017, 3, 28),
datetime.date(2017, 3, 29),
datetime.date(2017, 3, 30),
datetime.date(2017, 3, 31),
datetime.date(2017, 4, 1),
datetime.date(2017, 4, 2)]
或者使用datetime.isocalendar()
函数:
import datetime as dt
def get_week(y, w):
first = next(
(dt.date(y, 1, 1) + dt.timedelta(days=i)
for i in range(367)
if (dt.date(y, 1, 1) + dt.timedelta(days=i)).isocalendar()[1] == w))
return [first + dt.timedelta(days=i) for i in range(7)]
get_week(2017, 13)
根据您之前的研究,到目前为止您尝试了什么?我尝试了W的以下替代方案:U、W、V、V。想法是:获取日历周的第一天(或任何其他天),然后使用datetime.timedelta计算其他天。但是,似乎不能将“年cw”转换为日期。如果您知道第一周第一天的序号,那么添加
7*13
以获得第13周开始的序号……好主意,但这会变得棘手。例如,对于2017年,第一个等卡伦达周从1月2日开始(见)。这一点多年来一直在变化。我的问题是在假设我还不知道第一个日历周的第一天的情况下提出的。谢谢,看起来不错。然而,2017年,我的周数是从周日开始的,2018周数是从周一开始的,2019周数是从周二开始的,等等。为什么会这样?@jollycat-Oh,算作一个bug。1月1日不一定是星期天。这两行字解决了这个问题。这与我在问题下面最上面的评论中提到的问题有关。2017年,第一个等Calendar周以周日开始,2018年,第一个等Calendar周以周一开始,2019年,第一个等Calendar周以周二开始。当然,你可以硬编码这个模式,但这并不好,也不可靠(考虑到闰年)。我们只需返回到第一个星期天/星期一(取决于工作日0的含义),然后从那里算起7天。第四行解决了这个问题。但是,闰年呢?这在闰年会改变+2(而不是+1)。谢谢,看起来不错!它还解决了@hingev解决方案中的get_month(2096,1)
问题。