将日期范围按天分割,并使用Python列出列表日期间隔

将日期范围按天分割,并使用Python列出列表日期间隔,python,datetime,Python,Datetime,我有一系列的日期,如“2017-05-01”、“2017-05-18”。因此,我想将这个范围按每日间隔进行分割,并得到这样的结果:[[“2017-05-01”,“2017-05-02”],[“2017-05-3”,“2017-05-04”],…]您可以尝试一下,首先将字符串转换为日期时间并获得间隔,然后使用列表理解来生成列表: from datetime import datetime,timedelta st=["2017-05-01", "2017-05-19"] n=2 start=da

我有一系列的日期,如“2017-05-01”、“2017-05-18”。因此,我想将这个范围按每日间隔进行分割,并得到这样的结果:
[[“2017-05-01”,“2017-05-02”],[“2017-05-3”,“2017-05-04”],…]

您可以尝试一下,首先将字符串转换为
日期时间
并获得间隔,然后使用列表理解来生成列表:

from datetime import datetime,timedelta
st=["2017-05-01", "2017-05-19"]
n=2

start=datetime.strptime(st[0],"%Y-%m-%d")
end=datetime.strptime(st[1],"%Y-%m-%d")

r = [[(start+ timedelta(days=i)).strftime("%Y-%m-%d"),(start+ timedelta(days=i+1)).strftime("%Y-%m-%d")] if i!=(end-start).days else [(start+ timedelta(days=i)).strftime("%Y-%m-%d")] for i in range(0,(end-start).days+1,2)]

print r
结果:

[['2017-05-01', '2017-05-02'], ['2017-05-03', '2017-05-04'], ['2017-05-05', '2017-05-06'], ['2017-05-07', '2017-05-08'], ['2017-05-09', '2017-05-10'], ['2017-05-11', '2017-05-12'], ['2017-05-13', '2017-05-14'], ['2017-05-15', '2017-05-16'], ['2017-05-17', '2017-05-18'], ['2017-05-19']]
创造双人舞 下面是一个带有
datetime.timedelta(days=1)
的解决方案。您可以轻松地减少此代码

import datetime


input_dates = ['2017-05-01', '2017-05-17']
date_format = "%Y-%m-%d" # Format

# Set the range
start_date = datetime.datetime.strptime(input_dates[0], date_format)
end_date = datetime.datetime.strptime(input_dates[1], date_format)

# You can have the difference in days with this :
delta = (end_date - start_date)
diff_days = delta.days
print "Days diff : {}".format(diff_days) # Comment it

duos_list = []

for step in xrange(0, diff_days + 1, 2):
    date_1 = start_date + (datetime.timedelta(days=1) * step)
    date_2 = date_1 + datetime.timedelta(days=1)

    duo = [date_1.strftime(date_format)]
    # Not append date_2 if not in range
    if date_2 <= end_date:
        duo.append(date_2.strftime(date_format))

    # Append the duo of date on the result list
    duos_list.append( duo )

print repr(duos_list)
或者把它切块 在另一种方法中(我认为更好的方法),您也可以将列表分块:

import datetime


input_dates = ['2017-05-01', '2017-05-17']
date_format = "%Y-%m-%d" # Format
chunk_size = 2

# Set the range
start_date = datetime.datetime.strptime(input_dates[0], date_format)
end_date = datetime.datetime.strptime(input_dates[1], date_format)

# You can have the difference in days with this :
delta = (end_date - start_date)
diff_days = delta.days

print "Days diff : {}".format(diff_days)

# Create the list of date
date_list = [ (start_date + (datetime.timedelta(days=1) * x)).strftime(date_format)  for x in xrange(0, diff_days + 1)]

# Chunk this with correct size (2)
chunked_list = [date_list[i:i + chunk_size] for i in xrange(0, len(date_list), chunk_size)]

print repr(chunked_list)
输出:

Days diff : 16
[['2017-05-01', '2017-05-02'], ['2017-05-03', '2017-05-04'], ..., ['2017-05-17']]
Days diff : 16
[['2017-05-01', '2017-05-02'], ['2017-05-03', '2017-05-04'], ..., ['2017-05-17']]

首先,将其分解为两个步骤:

  • 从一个日期到另一个日期每天生成
  • 将列表[a,b,c,d]转换为对[a,b],[c,d]]
  • 对于第一步,这里有一个答案: 其中定义了以下生成器:

    from datetime import timedelta, date
    
    def daterange(start_date, end_date):
        for n in range(int ((end_date - start_date).days)):
            yield start_date + timedelta(n)
    
    如果我们将使用此定义的对象从以下位置配对:

    因此,我们可以将它们组合在一起,形成所需的生成器:

    daypairs = grouper(daterange(start_date, end_date), 2)
    
    并将其列为:

    daypairslist = list(daypairs)
    

    等等。

    你能举一个输入和输出这些字符串或日期对象的例子吗?我用其他的块解决方案编辑了我的文章。希望能有帮助。快乐编码!如果它对您有帮助,a+1或放置应答标志将是可观的:)
    daypairslist = list(daypairs)