2017-04-01 1 views
0

ich hier den Code anpassen möchten: Given a date range how can we break it up into N contiguous sub-intervals? einen Datumsbereich wie folgt aufgeteilt:Splitting Start- und Enddatum in Python zu separaten Jahren

Startdatum ist '2015-03-20' und Enddatum ist '2017-03-12'. Ich möchte es in 3 Teile aufteilen. Ein für jedes der 3 Jahre, so dass ich eine Liste wie diese:

[['2015-03-20', '2015-12-31'], ['2016-01-01', '2016-12-31'], ['2017-01-01', '2017-03-12']] 

Jeden pythonic Weg, dies zu tun?

Antwort

2

Wenn ich Ihre Bedeutung nicht falsch verstehe, können Sie nur die mittleren Jahre und fügen Sie es an die Zeichenfolge wie -12-31 oder -01-01.

start_date = '2015-03-20' 
end_date = '2018-03-12' 

def split_date(s,e): 
    return [[s,s[:4]+"-12-31"]]+ [['%s-01-01'%(str(i)), '%s-12-31'%(str(i))] for i in range(int(s[:4])+1,int(e[:4]))]+[[e[:4] + "-01-01", e]] 

print(split_date(start_date,end_date)) 

Ergebnis:

[['2015-03-20', '2015-12-31'], ['2016-01-01', '2016-12-31'], ['2017-01-01', '2017-12-31'], ['2018-01-01', '2018-03-12']] 
+0

danke @McGrady, das sieht aus wie was ich will! Jede Möglichkeit, sie in eine normale Schleife umzuwandeln, erleichtert das Verständnis – user308827

0

Ändern des ursprünglichen Codes, die Sie verknüpft:

from datetime import datetime, timedelta 


def date_range(start, end, interval): 
    start = datetime.strptime(start, "%Y%m%d") 
    end = datetime.strptime(end, "%Y%m%d") 
    diff = (end - start)/interval 
    for i in range(interval): 
     if i == 0: 
      date_additive = 0 
     else: 
      date_additive = 1 
     yield ["{0}-{1}-{2}".format(str(((start + diff * i) + timedelta(days=date_additive)).strftime("%Y").zfill(2)), 
            str(((start + diff * i) + timedelta(days=date_additive)).strftime("%m").zfill(2)), 
            str(((start + diff * i) + timedelta(days=date_additive)).strftime("%d").zfill(2))), 
       "{0}-{1}-{2}".format(str((start + diff * (i + 1)).strftime("%Y").zfill(2)), 
            str((start + diff * (i + 1)).strftime("%m").zfill(2)), 
            str((start + diff * (i + 1)).strftime("%d").zfill(2)))] 

Eingabebeispiel:

def main(): 
    begin = "20150320" 
    end = "20170312" 
    interval = 3 
    print(list(date_range(begin, end, interval))) 

main() 

Ergebnisse:

[['2015-03-20', '2015-11-16'], ['2015-11-17', '2016-07-14'], ['2016-07-15', '2017-03-12']] 
Verwandte Themen