簡體   English   中英

用介於兩者之間的日期填充開始/結束日期列表

[英]Fill list of start/end dates with dates in between

給定一個具有以下結構的列表:

[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:列表的長度將始終是偶數(因此沒有沒有結束的循環開始)。

這是使用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', '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']]

(為了可讀性插入換行符)

您可以使用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
>>> 
>>> 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']]

您可以使用datetime模塊中的timedelta從開始到結束日期進行迭代,如下所示

from datetime import datetime as dt, timedelta as td
strp,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']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM