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

时间:2011-05-03 10:25:40

标签: python datetime

我有两个字符串变量,其中包含yyyy-mm-dd格式的日期,如下所示:

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

我想编写生成date1到date2范围内所有日期的代码。如何在Python中完成?

9 个答案:

答案 0 :(得分:26)

日期可以像数字一样相互比较,您可以使用datetime.timedelta对象进行与日期相关的数学运算。这里没有理由使用dateutil,并且没有理由对a la'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
>>> 

答案 1 :(得分:23)

Pandas非常适合时间序列,并且直接支持日期范围和日期解析(它是自动化的)。

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

它还有很多选项可以让生活更轻松。例如,如果您只想要工作日,则只需交换bdate_range

请参阅http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps

答案 2 :(得分:17)

from dateutil import rrule, parser

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

dates = list(rrule.rrule(rrule.DAILY,
                         dtstart=parser.parse(date1),
                         until=parser.parse(date2)))

print dates

由于dateutil不是标准库,因此您必须将其作为单独的包安装。有关格式的更多详细信息,请参阅文档(尤其是dayfirstyearfirst开关)。

答案 3 :(得分:6)

假设您的日期已经是datetime.date课程,您可以使用.fromordinal.toordinal来创建此oneliner。

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.toordinal() + 1用于包含end_date的范围。

答案 4 :(得分:3)

import time

def dates_between(start, end):
  start_epoch = int(time.mktime(time.strptime(start, "%Y-%m-%d")))
  end_epoch = int(time.mktime(time.strptime(end, "%Y-%m-%d"))) + 1 #include end
  return range(start_epoch, end_epoch, 86400)

答案 5 :(得分:3)

我喜欢这个,因为它很直观,它提供了一组日期字符串。

import re
import datetime

def datetime_to_str_date(dt):
    return re.sub(r'\T.+$','', dt.isoformat())

start_date = datetime.datetime.strptime('2016-01-01', '%Y-%m-%d')
end_date = datetime.datetime.today()
num_of_days = (end_date - start_date).days

date_list = map(
        datetime_to_str_date, 
        [start_date + datetime.timedelta(days=x) for x in range(0, num_of_days)]
)

答案 6 :(得分:2)

import datetime
real_date1 = datetime.date(*[int(x) for x in date1.split('-')])
real_date2 = datetime.date(*[int(x) for x in date2.split('-')])
date_range =  real_date2 - real_date1
dates = list()
for days in xrange(date_range.days):
    dates.append(real_date1 + datetime.timedelta(days))

print dates

答案 7 :(得分:1)

>>> for a in range(9):
...     print(datetime.date(2011, 05, 03) + datetime.timedelta(a))
...
2011-05-03
2011-05-04
2011-05-05
2011-05-06
2011-05-07
2011-05-08
2011-05-09
2011-05-10
2011-05-11

我不太确定字符串的解析是否是完整的,或者只是你开始问题的方式。如果是这样,请忽略答案过于简单

答案 8 :(得分:-4)

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