用介于两者之间的日期填写开始/结束日期列表

2024-06-16 08:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[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']]

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


Tags: 信息元素列表date时间情况结构start
1条回答
网友
1楼 · 发布于 2024-06-16 08:26:56

这是一种使用datetime模块的方法

Ex:

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']]
网友
2楼 · 发布于 2024-06-16 08:26:56

您可以将字符串解析为datetime对象,使用它们进行必要的计算(通过添加timedelta对象),然后在最后转换回字符串

要以嵌套列表的形式生成输出,如问题中所述,临时变量dates_out用于生成内部列表,这些列表附加到循环内的主列表(out

如果要使用日-月-年排序,请在发生的位置将'%m-%d-%Y'更改为'%d-%m-%Y'

import datetime

dates = ['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):
    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', '10-24-2019', '10-25-2019', '10-26-2019'],
 ['11-02-2019', '11-03-2019', '11-04-2019', '11-05-2019', '11-06-2019']]

(为便于阅读,插入了换行符)

网友
3楼 · 发布于 2024-06-16 08:26:56

您可以使用dateutil模块轻松地实现这一点。您可以通过执行pip install python-dateutil来安装它

map(parse, lst)将日期从字符串转换为日期时间对象zip(*[map(parse, lst)]*2)将创建日期时间对象对,以便您可以将它们作为(start,end)对进行导航。最后rrule(freq=DAILY, dtstart=start, until=end)从开始到结束创建一系列datetime对象

>>> from dateutil.rrule import rrule, DAILY
>>> from dateutil.parser import parse
>>> 
>>> 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  zip(*[map(parse, lst)]*2)]
>>> 
>>> print(res)
[['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']]

相关问题 更多 >