Python 用介于两者之间的日期填写开始/结束日期列表
给定具有以下结构的列表:Python 用介于两者之间的日期填写开始/结束日期列表,python,datetime,Python,Datetime,给定具有以下结构的列表: [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_
[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']]
备注:列表的长度将始终为偶数(因此没有循环的开始就没有结束)。这是使用
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']]
您可以将字符串解析为
datetime
对象,使用它们进行必要的计算(通过添加timedelta
对象),然后在末尾转换回字符串
要以嵌套列表的形式生成输出,如问题中所述,临时变量dates\u 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)
(为便于阅读而插入换行符)您可以使用
dateutil
模块轻松完成此操作。您可以通过执行pip install python dateutil
来安装它
map(parse,lst)
将日期从字符串转换为datetime objzip(*[map(parse,lst)]*2)
将创建日期时间对象对,以便您可以将它们作为(开始,结束)
对进行导航。最后,rrule(freq=DAILY,dtstart=start,till=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']]
您可以使用
timedelta
fromdatetime
模块从开始日期到结束日期进行迭代,如下所示
从datetime导入datetime作为dt,timedelta作为td
strp,strf,fmt=dt.strptime,dt.strftime,“%m-%d-%Y”
a=['10-23-2019','10-26-2019','11-02-2019','11-06-2019']
在zip(a[::2],a[1::2])中打印[strf(k,fmt)表示k in(strp(i,fmt)+td(days=n)表示n范围内的n((strp(j,fmt)-strp(i,fmt)).days+1))]
输出
[['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']]
您尝试了什么?请重新执行,阅读并提供。“为我实现此功能”是本网站的主题。你必须做出诚实的尝试,然后问一个关于你的算法或技术的具体问题。
[['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']]