关于datetime:在python中生成给定范围内的所有日期

Generating all dates within a given range in python

我有两个字符串变量中包含的日期格式为YYYY-MM-DD如下:

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

我想写代码,在哪里所有的date1到date2日期范围。如何在Python中这样做吗?


日期可以相对于彼此就像数,你可以从日期和相关的datetime.timedelta数学对象。没有理由使用dateutil这里,没在理由iterations硬代码的数量在它的范围(9)。这真的成为类似于你如何处理(老式)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> 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
>>>

大熊猫是一个适当的时间序列,在一般情况下,都是直接支持和蛛网膜下腔出血(SAH)的日期(日期范围和分析它的automagic)。

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

它也有很多的选项,使生活更容易。例如,如果你想要,你就只会在weekdays,bdate_range互换。

国有企业pandas.pydata.org http://///timeseries.html熊猫-文档#产生稳定的测量的时间戳


1
2
3
4
5
6
7
8
9
10
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开关)。


你已经是assuming日期的类,你可以使用datetime.date.fromordinal.toordinal到这oneliner创建。

1
2
3
4
5
6
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_dateend_date.toordinal() + 1范围使用。


我喜欢这一个,因为它是直观的和它的一个字符串数组给日期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)]
)

1
2
3
4
5
6
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)


1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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

我不太确定是否字符串解析的积分或是刚刚入门的方式将你的问题。如果是,请disregard oversimplified的答案