填写开始/结束日期列表及其之间的日期

给定一个具有以下结构的列表:

[start_date_cycle1, end_date_cycle1, start_date_cycle2, end_date_cycle2, ..., end_date_cycleK]

其中所有元素都是时间戳,我想得到以下内容

[[start_date_cycle1, start_date_cycle1 +1d, start_date_cycle1 +2d, ..., end_date_cycle1],
[start_date_cycle2, start_date_cycle2 +1d ...]]

因此,如果输入为['10-23-2019', '10-26-2019' , '11-02-2019', '11-06-2019'],则输出将为:

[['10-23-2019', '10-24-2019','10-25-2019', '10-26-2019'] ,
 ['11-02-2019', '11-03-2019','11-04-2019','11-05-2019','11-06-2019']]

PS:列表的长度始终是偶数(因此没有结束就没有循环的开始)。


慕尼黑的夜晚无繁华
浏览 231回答 4
4回答

翻阅古今

您可以使用timedeltafrom datetimemodule 从开始日期到结束日期进行迭代,如下所示from datetime import datetime as dt, timedelta as tdstrp,strf,fmt=dt.strptime,dt.strftime,"%m-%d-%Y"a=['10-23-2019', '10-26-2019' , '11-02-2019', '11-06-2019']print([[strf(k,fmt) for k in (strp(i,fmt)+td(days=n) for n in range((strp(j,fmt)-strp(i,fmt)).days+1))] for i,j in zip(a[::2],a[1::2])])输出[['10-23-2019', '10-24-2019', '10-25-2019', '10-26-2019'], ['11-02-2019', '11-03-2019', '11-04-2019', '11-05-2019', '11-06-2019']]

MYYA

您可以将字符串解析为datetime对象,使用它们进行必要的计算(通过添加timedelta对象),然后最后转换回字符串。为了按照问题中的指定将输出生成为嵌套列表,临时变量dates_out用于生成内部列表,这些列表将附加到out循环内的主列表 ( ) 中。如果您想使用日-月-年排序,请在出现该顺序的地方将 更改'%m-%d-%Y'为。'%d-%m-%Y'import datetimedates = ['10-23-2019', '10-26-2019' , '11-02-2019', '11-06-2019']format = '%m-%d-%Y'dts = [datetime.datetime.strptime(date, format) for date in dates]out = []i = iter(dts)for start, end in zip(i, i):&nbsp; &nbsp; dt = start&nbsp; &nbsp; dates_out = []&nbsp; &nbsp; while dt <= end:&nbsp; &nbsp; &nbsp; &nbsp; dates_out.append(datetime.datetime.strftime(dt, format))&nbsp; &nbsp; &nbsp; &nbsp; dt += datetime.timedelta(days=1)&nbsp; &nbsp; out.append(dates_out)print(out)这给出:[['10-23-2019', '10-24-2019', '10-25-2019', '10-26-2019'],&nbsp;['11-02-2019', '11-03-2019', '11-04-2019', '11-05-2019', '11-06-2019']](为了可读性插入换行符)

函数式编程

您可以使用dateutil模块轻松完成此操作。您可以通过执行以下操作来安装它pip install python-dateutil。map(parse, lst)将日期从字符串转换为日期时间对象;zip(*[map(parse, lst)]*2)将创建成对的日期时间对象,以便您可以成对地导航它们(start,end)。最后rrule(freq=DAILY, dtstart=start, until=end)创建从开始到结束的一系列日期时间对象>>> from dateutil.rrule import rrule, DAILY>>> from dateutil.parser import parse>>>&nbsp;>>> lst = ['10-23-2019', '10-26-2019' , '11-02-2019', '11-06-2019']>>> res = [[dt.strftime('%m-%d-%Y') for dt in rrule(freq=DAILY, dtstart=start, until=end)] for start,end in&nbsp; zip(*[map(parse, lst)]*2)]>>>&nbsp;>>> print(res)[['10-23-2019', '10-24-2019', '10-25-2019', '10-26-2019'],&nbsp;['11-02-2019', '11-03-2019', '11-04-2019', '11-05-2019', '11-06-2019']]

跃然一笑

datetime这是使用模块的一种方法前任:import datetimedata = ['10-23-2019', '10-26-2019' , '11-02-2019', '11-06-2019']result = []for s, e in zip(data[::2], data[1::2]):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # (10-23-2019, 10-26-2019)....&nbsp; &nbsp; s = datetime.datetime.strptime(s, "%m-%d-%Y")&nbsp; &nbsp; e = datetime.datetime.strptime(e, "%m-%d-%Y")&nbsp; &nbsp; temp = []&nbsp; &nbsp; while s <= e:&nbsp; &nbsp; &nbsp; &nbsp; temp.append(s.strftime("%m-%d-%Y"))&nbsp; &nbsp; &nbsp; &nbsp; s += datetime.timedelta(days=1)&nbsp; &nbsp; if temp:&nbsp; &nbsp; &nbsp; &nbsp; result.append(temp)print(result)输出:[['10-23-2019', '10-24-2019', '10-25-2019', '10-26-2019'],&nbsp;['11-02-2019', '11-03-2019', '11-04-2019', '11-05-2019', '11-06-2019']]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python