在Python中生成给定范围内的所有日期

35 投票
9 回答
77464 浏览
提问于 2025-04-16 16:53

我有两个字符串变量,它们包含的日期格式是 yyyy-mm-dd,内容如下:

date1 = '2011-05-03'
date2 = '2011-05-10'

我想写一段代码,生成从 date1 到 date2 之间的所有日期。请问在 Python 中怎么实现呢?

9 个回答

22

假设你的日期已经是 datetime.date 这个类型了,你可以用 .fromordinal.toordinal 来写出一个简单的一行代码。

from datetime import date

start_date = date(2011, 5, 3)
end_date = date(2011, 5, 10)

[date.fromordinal(i) for i in range(start_date.toordinal(), end_date.toordinal())]

这个结果是不包括 end_date 的。如果你想要包含 end_date,可以用 end_date.toordinal() + 1


你可以很简单地把上面的代码变成一个 生成器,方法是

from datetime import date


def date_range(x, y, inclusive=False):

    inclusive_nr = 1 if inclusive else 0

    if isinstance(x, date) and isinstance(y, date):

        for i in range(x.toordinal(), y.toordinal() + inclusive_nr):
            yield date.fromordinal(i)

    else:
        raise TypeError("Parameters x and y should be dates.")

例子

>>> from datetime import date
>>> end_date = date(2011, 5, 10)
>>> start_date = date(2011, 5, 3)
>>> [str(d) for d in date_range(start_date, end_date, inclusive=True)]
['2011-05-03', '2011-05-04', '2011-05-05', '2011-05-06', '2011-05-07', '2011-05-08', '2011-05-09', '2011-05-10']
36

日期之间可以像数字一样进行比较,你也可以使用datetime.timedelta对象进行与日期相关的数学运算。在这里没有必要使用dateutil库,也没有必要像'range(9)'那样硬编码循环的次数。其实这和处理普通数字的方法很相似。

>>> import datetime
>>> date1 = '2011-05-03'
>>> date2 = '2011-05-10'
>>> start = datetime.datetime.strptime(date1, '%Y-%m-%d')
>>> end = datetime.datetime.strptime(date2, '%Y-%m-%d')
>>> step = datetime.timedelta(days=1)
>>> while start <= end:
...     print start.date()
...     start += step
... 
2011-05-03
2011-05-04
2011-05-05
2011-05-06
2011-05-07
2011-05-08
2011-05-09
2011-05-10
>>> 
56

Pandas 是处理时间序列数据的好工具,它可以很方便地处理日期范围和日期解析(这点非常神奇)。

import pandas as pd
date1 = '2011-05-03'
date2 = '2011-05-10'
mydates = pd.date_range(date1, date2).tolist()

它还有很多选项可以让你的工作更轻松。比如,如果你只想要工作日的日期,你只需要换成 bdate_range 就可以了。

更多信息可以查看 https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#generating-ranges-of-timestamps

撰写回答