微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

填写开始/结束日期列表,中间的日期在

如何解决填写开始/结束日期列表,中间的日期在

给出具有以下结构的列表:

[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 举报,一经查实,本站将立刻删除。