如何使用Python选择一年中的所有星期日?

Rya*_*ery 23 python datetime calendar

使用Python ...

如何在一年中选择所有星期日(或任何一天)?

[ '01/03/2010','01/10/2010','01/17/2010','01/24/2010', ...]
Run Code Online (Sandbox Code Playgroud)

这些日期代表2010年的星期日.这也适用于我认为的一周中的任何一天.

sth*_*sth 46

您可以使用datedatetime模块查找一年中的第一个星期日,然后继续添加七天,生成新的星期日:

from datetime import date, timedelta

def allsundays(year):
   d = date(year, 1, 1)                    # January 1st
   d += timedelta(days = 6 - d.weekday())  # First Sunday
   while d.year == year:
      yield d
      d += timedelta(days = 7)

for d in allsundays(2010):
   print(d)
Run Code Online (Sandbox Code Playgroud)

  • @sjpatel:您需要将偏移计算更改为从第一个星期六而不是星期日开始.这可以用`timedelta(days =(5-d.weekday()+ 7)%7)`来完成.或者,更明确地`timedelta(days =(5 - d.weekday()if d.weekday()<= 5 else 7 + 5 - d.weekday())) (2认同)

Bra*_*mon 22

Pandas 的功能为此目的提供了date_range()强大的功能。

结果是一个 pandas DatetimeIndex,但可以轻松转换为列表。

import pandas as pd

def allsundays(year):
    return pd.date_range(start=str(year), end=str(year+1), 
                         freq='W-SUN').strftime('%m/%d/%Y').tolist()

allsundays(2017)[:5]  # First 5 Sundays of 2017
# ['01/01/2017', '01/08/2017', '01/15/2017', '01/22/2017', '01/29/2017']
Run Code Online (Sandbox Code Playgroud)


小智 8

使用列表理解:

from datetime import date, timedelta
dstart = date(2018,1,1)
dend = date(2018,12,31)
# this will return all sundays between start-end dates.
days = [dstart + timedelta(days=x) for x in range((dend-dstart).days + 1) if (dstart + timedelta(days=x)).weekday() == 6]
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 7

使用dateutil模块,您可以这样生成列表:

#!/usr/bin/env python
import dateutil.relativedelta as relativedelta
import dateutil.rrule as rrule
import datetime
year=2010
before=datetime.datetime(year,1,1)
after=datetime.datetime(year,12,31)
rr = rrule.rrule(rrule.WEEKLY,byweekday=relativedelta.SU,dtstart=before)
print rr.between(before,after,inc=True)
Run Code Online (Sandbox Code Playgroud)

虽然如果没有dateutil,找到所有星期日并不难,但是这个模块非常方便,特别是如果你有更复杂或更多的日期计算.

如果您使用的是Debian/Ubuntu,则dateutil由python-dateutil包提供.


小智 5

您可以遍历该年的日历。下面应该返回给定年份的所有星期二和星期四。

# Returns all Tuesdays and Thursdays of a given year
from datetime import date
import calendar

year = 2016
c = calendar.TextCalendar(calendar.SUNDAY)
for m in range(1,13):
    for i in c.itermonthdays(year,m):
        if i != 0:                                      #calendar constructs months with leading zeros (days belongng to the previous month)
            day = date(year,m,i)
            if day.weekday() == 1 or day.weekday() == 3: #if its Tuesday or Thursday
                print "%s-%s-%s" % (year,m,i)
Run Code Online (Sandbox Code Playgroud)

  • 不错的答案!对于我想注意的陌生人,只需在打印表达式中添加括号,此代码将由 Python 3 运行 (2认同)

zab*_*bop 5

如果寻找更通用的方法(即不仅是星期日),我们可以建立在sth答案上

def weeknum(dayname):
    if dayname == 'Monday':   return 0
    if dayname == 'Tuesday':  return 1
    if dayname == 'Wednesday':return 2
    if dayname == 'Thursday': return 3
    if dayname == 'Friday':   return 4
    if dayname == 'Saturday': return 5
    if dayname == 'Sunday':   return 6
Run Code Online (Sandbox Code Playgroud)

这会将当天的名称转换为int.

然后做:

从日期时间导入日期,时间增量

def alldays(year, whichDayYouWant):
    d = date(year, 1, 1)
    d += timedelta(days = (weeknum(whichDayYouWant) - d.weekday()) % 7)
    while d.year == year:
        yield d
        d += timedelta(days = 7)

for d in alldays(2020,'Sunday'):
    print(d)
Run Code Online (Sandbox Code Playgroud)

注意% 7in的存在alldays()。这输出:

2020-01-05
2020-01-12
2020-01-19
2020-01-26
2020-02-02
2020-02-09
2020-02-16
...
Run Code Online (Sandbox Code Playgroud)

还可以这样做:

for d in alldays(2020,'Friday'):
    print(d)
Run Code Online (Sandbox Code Playgroud)

这会给你:

2020-01-03
2020-01-10
2020-01-17
2020-01-24
2020-01-31
2020-02-07
2020-02-14
...
Run Code Online (Sandbox Code Playgroud)