Python:迭代一个月中的所有日子

Chg*_*gad 2 python iteration date

有没有一种简单的方法来迭代给定月份的所有日子?

我想要一种方法,其中我正在迭代的对象具有作为datetime.date对象的日子。我已经找到了calendar模块及其Calendar类和相应的方法itermonthdates(year, month)

我的问题是生成的迭代器包含“填充”天来表示完整的周。例如,2019 年 7 月在星期三 (31) 结束。所以这一周是不完整的,并itermonthdates()添加了 8 月 1-4 日的日期。

我不想要这种行为。

我的第一个猜测是这样的:

from calendar import Calendar, monthrange
c = Calendar()

for date in list(c.itermonthdates(2019, 7))[:monthrange(2019, 7)[1]]:
    print(date)
Run Code Online (Sandbox Code Playgroud)

它的行为符合预期,但我不确定是否有更好、更优雅的方法来做到这一点。

che*_*ner 8

只需date按月过滤对象。

for d in [x for x in c.itermonthdates(2019, 7) if x.month == 7]:
Run Code Online (Sandbox Code Playgroud)


Mad*_*ist 6

calendar模块旨在显示日历。如果您正在寻找简单的东西,最好calendar.monthlendatetime.date它自己结合使用来获取迭代器:

def date_iter(year, month):
    for i in range(1, calendar.monthlen(year, month) + 1):
        yield date(year, month, i)

for d in date_iter(2019, 12):
    print(d)
Run Code Online (Sandbox Code Playgroud)

你当然可以把整个事情写成一行:

for d in (date(2019, 12, i) for i in range(1, calendar.monthlen(2019, 12) + 1)):
    print(d)
Run Code Online (Sandbox Code Playgroud)

monthlen属性似乎是calendarPython 3.7 中的公共但未记录的属性。它类似于 的第二个元素monthrange,因此您可以monthrange(year, month)[1]在上面的代码中将其替换为。

  • 它似乎不再存在于 Python 3.8 中(至少在 Ubuntu 20.04 中不存在)。 (3认同)