Python 打印日期范围之间的所有星期四

Python 打印日期范围之间的所有星期四,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我想打印这些日期范围之间的所有星期四 from datetime import date, timedelta sdate = date(2015, 1, 7) # start date edate = date(2015, 12, 31) # end date 最好的Python方式是什么?导入日期时间 导入日历 def工作日计数(开始、结束、日期): start_date=datetime.datetime.strtime(开始,“%d/%m/%Y”) end_date=datet

我想打印这些日期范围之间的所有星期四

from datetime import date, timedelta
sdate = date(2015, 1, 7)   # start date
edate = date(2015, 12, 31)   # end date
最好的Python方式是什么?

导入日期时间
导入日历
def工作日计数(开始、结束、日期):
start_date=datetime.datetime.strtime(开始,“%d/%m/%Y”)
end_date=datetime.datetime.strtime(end,“%d/%m/%Y”)
日计数=[]
对于范围内的i((结束日期-开始日期)。天):
如果日历.day\u名称[(开始日期+日期时间.timedelta(days=i+1)).weekday()]==天:
打印(str(start_date+datetime.timedelta(days=i+1)).split()[0])
工作日计数(“2017年1月1日”、“2017年1月31日”、“星期四”)
#打印结果
# 2017-01-05
# 2017-01-12
# 2017-01-19
# 2017-01-26

使用您的
sdate.weekday()#返回介于0(周一)和6(周日)之间的整数

sdate=。。。
当sdate
简单解决方案:

from datetime import date, timedelta

sdate = date(2015, 1, 7)   # start date
edate = date(2015, 12, 31)   # end date

day_index = 3  # Thursday
delta = (day_index - sdate.weekday()) % 7
match = sdate + timedelta(days=delta)

while match <= edate:  # Change this to `<` to ignore the last one
    print(match) # Can be easily converted to a generator with `yield`
    match += timedelta(days=7)

# 2015-01-08
# 2015-01-15
# ...
# 2015-12-24
# 2015-12-31
from datetime导入日期,timedelta
sdate=日期(2015年1月7日)#开始日期
edate=日期(2015年12月31日)#结束日期
delta=edate-sdate
范围内的天数(增量天数+1):
day_obj=sdate+timedelta(天=天)
如果day_obj.weekday()=3:#周四
打印(日)
# 2015-01-08
# 2015-01-15
# ...
# 2015-12-24
# 2015-12-31
最有效的解决方案:

from datetime import date, timedelta

sdate = date(2015, 1, 7)   # start date
edate = date(2015, 12, 31)   # end date

day_index = 3  # Thursday
delta = (day_index - sdate.weekday()) % 7
match = sdate + timedelta(days=delta)

while match <= edate:  # Change this to `<` to ignore the last one
    print(match) # Can be easily converted to a generator with `yield`
    match += timedelta(days=7)

# 2015-01-08
# 2015-01-15
# ...
# 2015-12-24
# 2015-12-31
from datetime导入日期,timedelta
sdate=日期(2015年1月7日)#开始日期
edate=日期(2015年12月31日)#结束日期
日指数=3#周四
增量=(日索引-sdate.weekday())%7
匹配=sdate+时间增量(天数=增量)

当匹配时,您可以尝试列表理解,以获得两个日期之间的星期四

此代码实际上以格式化字符串的形式输出日期,但您可以通过删除
strftime
来获取实际日期

from datetime导入日期,timedelta
sdate=日期(2015年1月7日)#开始日期
edate=日期(2015年12月31日)#结束日期
星期四=[(sdate+timedelta(days=d)).strftime(“%A%Y-%m-%d”)用于范围(0,(edate-sdate).days+1)内的d
如果(sdate+timedelta(days=d)).weekday()==3]
打印('\n'.加入(星期四))
“”“示例输出
2015年1月8日星期四
2015年1月15日星期四
2015年1月22日星期四
2015年1月29日星期四
2015年2月5日星期四
2015年2月12日星期四
""""

计算从开始日期到星期四的天数:

days_to_thursday = (3 - sdate.weekday()) % 7
计算两个日期之间的星期四数:

week_diff = ((edate - sdate).days - days_to_thursday ) // 7
获取日期范围内的所有星期四:

thursdays = [sdate + timedelta(days=days_to_thursday + 7 * more_weeks) \
    for more_weeks in range(week_diff + 1) ]
如果需要,请打印它们:

for t in thursdays:
    print(t)

大多数人每天都在重复,这是一种浪费。将周四的计算推迟到你真正需要的时候可能会有所帮助。为此,你可以使用生成器

def get_天数(开始,天数索引,结束=无):
#将开始日期设置为下一个有效日期
start+=timedelta(天=(天索引-start.weekday())%7)
周=时间增量(天=7)
当结束和开始<结束或不结束:
产量起点
开始+=周
这会延迟第二天的获取,直到您需要它,如果您不指定和结束日期,则允许无限天

thursday_generator = get_days(date(2015, 1, 7), 3, date(2015, 12, 31))
print(list(thursday_generator))

"""
[datetime.date(2015, 1, 8), datetime.date(2015, 1, 15), datetime.date(2015, 1, 22), ...]
"""
您可以轻松地转储为字符串:

print("\n".join(map(str, thursday_generator)))

"""
2015-01-08
2015-01-15
2015-01-22
...
"""
您还可以使用f字符串进行自定义字符串格式设置:

print("\n".join(f"{day:%A %x}" for day in thursday_generator))

"""
Thursday 01/08/15
Thursday 01/15/15
Thursday 01/22/15
...
"""
如果不指定结束日期,它将永远持续下去

In [28]: thursday_generator = get_days(date(2015, 1, 7), 3)
    ...: print(len(list(thursday_generator)))
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-28-b161cdcccc75> in <module>
      1 thursday_generator = get_days(date(2015, 1, 7), 3)
----> 2 print(len(list(thursday_generator)))

<ipython-input-16-0691db329606> in get_days(start, day_index, end)
      5     while end and start < end or not end:
      6         yield start
----> 7         start += week
      8

OverflowError: date value out of range
[28]中的
:星期四生成器=获取天数(日期(2015,1,7,3)
…:打印(len(列表(星期四生成器)))
---------------------------------------------------------------------------
溢出错误回溯(上次最近调用)
在里面
1个星期四生成器=获取天数(日期(2015年1月7日),3)
---->2份打印件(len(列表(星期四生成器)))
获取天数(开始、天数索引、结束)
5当结束和开始<结束或不结束:
6收益率开始
---->7开始+=一周
8.
溢出错误:日期值超出范围

我想打印日期范围之间的星期四尝试编辑的答案我不需要打印星期四的总日期,但需要打印星期四的日期如果我不需要时间,只需要打印日期怎么办您可以尝试从deltatime对象提取日期,或将其转换为str,然后拆分和索引(如编辑的答案所示)
abs
函数使此解决方案对于任何工作日大于3的sdate都不正确。它分别给出
1、2或3
的增量,而不是
6、5或4
。谢谢,确实!已修复。它不会为每个星期四打印正确的数据2016@sam看起来它在2016年的所有周四都会打印出来:谢谢你指出了诀窍负数除以正数的余数。我以前不知道,这是一个非常有用的性质。