如何解决填写开始/结束日期列表,中间的日期在
给出具有以下结构的列表:
[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']]
P.S:列表的长度将始终为偶数(因此循环的开始没有结束)。
解决方法
这是使用datetime
模块的一种方法
例如:
import datetime
data = ['10-23-2019','10-26-2019','11-02-2019','11-06-2019']
result = []
for s,e in zip(data[::2],data[1::2]): # (10-23-2019,10-26-2019)....
s = datetime.datetime.strptime(s,"%m-%d-%Y")
e = datetime.datetime.strptime(e,"%m-%d-%Y")
temp = []
while s <= e:
temp.append(s.strftime("%m-%d-%Y"))
s += datetime.timedelta(days=1)
if temp:
result.append(temp)
print(result)
输出:
[['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']]
,
您可以将字符串解析为datetime
对象,使用它们进行必要的计算(通过添加timedelta
对象),然后最后将其转换回字符串。
要按照问题中的说明将输出生成为嵌套列表,临时变量dates_out
用于生成内部列表,这些内部列表将附加到内部列表的主列表(out
)中。循环。
如果要使用按月,月,年的顺序,请在发生的位置将'%m-%d-%Y'
更改为'%d-%m-%Y'
。
import datetime
dates = ['10-23-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):
dt = start
dates_out = []
while dt <= end:
dates_out.append(datetime.datetime.strftime(dt,format))
dt += datetime.timedelta(days=1)
out.append(dates_out)
print(out)
这给出了:
[['10-23-2019','11-06-2019']]
(插入新行以提高可读性)
,您可以使用dateutil
模块轻松地做到这一点。您可以通过执行pip install python-dateutil
来安装它。
map(parse,lst)
会将日期从字符串转换为datetime obj; zip(*[map(parse,lst)]*2)
将创建一对日期时间obj,以便您可以将它们作为(start,end)
对进行导航。最后rrule(freq=DAILY,dtstart=start,until=end)
从开始到结束创建一系列日期时间objs
>>> from dateutil.rrule import rrule,DAILY
>>> from dateutil.parser import parse
>>>
>>> lst = ['10-23-2019','11-06-2019']
>>> res = [[dt.strftime('%m-%d-%Y') for dt in rrule(freq=DAILY,until=end)] for start,end in zip(*[map(parse,lst)]*2)]
>>>
>>> print(res)
[['10-23-2019','11-06-2019']]
,
您可以使用timedelta
模块中的datetime
从开始日期到结束日期进行迭代,如下所示
from datetime import datetime as dt,timedelta as td
strp,strf,fmt=dt.strptime,dt.strftime,"%m-%d-%Y"
a=['10-23-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','11-06-2019']]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。