2016-10-27 1 views
0

Ich habe einen Code geschrieben, um Anfragen an eine API zu senden. Die API ermöglicht die Suche zwischen einem bestimmten Datumssatz. Mein Code nimmt ein Datetime-Objekt und erhöht dieses Objekt um ein Timedelta, lasst uns dieses Timedelta aufrufen. Ich habe ein zweites Datetime-Objekt, das die by d-1 inkrementiert. Die Idee ist, nicht überlappende Zeiträume zu erhalten. Alles scheint gut zu funktionieren, außer wenn sich das Datum von November bis zum 31. Oktober ändert, ist der Monat, der zu meiner Datumszeit zurückkehrt, falsch. Hier ist der Code:timedelta gibt falschen Monat zurück

start_date=datetime(2013,9,22) 
end_date=datetime(2013,12,1) 

d = start_date 
delta = timedelta(days=10) 

while d <= end_date: 
    ys=d.strftime('%Y') 
    ms=d.strftime('%m') 
    ds=d.strftime('%d') 
    d += delta 

    ye=d.strftime('%Y') 
    me=d.strftime('%m') 
    de=(d-timedelta(days=1)).strftime('%d') 
    print ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de 

Und hier ist die Ausgabe: 2013-09-22..2013-10-01

2013-10-02..2013-10-11 
2013-10-12..2013-10-21 
2013-10-22..2013-11-31 #the second date printed should be 2013-10-31 
2013-11-01..2013-11-10 
2013-11-11..2013-11-20 
2013-11-21..2013-12-30 
2013-12-01..2013-12-10 

Jede Idee, warum dies geschieht?

+0

Probieren Sie die * freeze_gun * Bibliothek für Unit-Tests verwenden, so dass Sie debuggen können. Ermöglicht es Ihnen, das aktuelle Datum/die aktuelle Uhrzeit einfach nachzuahmen – Maximas

+1

Sie berechnen den Monat für den ersten Tag des nächsten Abschnitts, aber den Tag, indem Sie eins subtrahieren. versuche mit 'final_day = d-timedelta (Tage = 1); ye = final_day.strftime ("% Y") ... usw. –

+0

Ja, Sie haben Recht, ich sehe meinen Fehler jetzt, nachdem ich einen Tag die ganze Zeit Objektänderung subtrahieren, aber der Monat und das Jahr zuvor als String nicht definiert. – asado23

Antwort

0

Try d-timedelta(days=1) auf alle ye, me und de zu verwenden, nicht nur de

1

, nachdem Sie ausgeführt haben:

d += delta 

dann d das Startdatum des nächsten Intervalls, in einem Fall darstellt, in Ihren Daten, die 2013-11-01 ist, wenn Sie das Jahr und den Monat dieser Daten erhalten, erhalten Sie 2013-11 und dann erhalten Sie das Datum eines Tages, der 2013-10-31 ist, so dass esbekommtstattdessen erhalten alle drei Felder von einem Tag vor:

end_interval=d-timedelta(days=1) 
ye = end_interval.strftime('%Y') 
me=end_interval.strftime('%m') 
de=(end_interval).strftime('%d') 
print(ys+'-'+ms+'-'+ds+'..'+ye+'-'+me+'-'+de) 

oder viel prägnanter können Sie strftime('%Y-%m-%d') verwenden alle drei Felder auf einmal zu bekommen.

start_str = d.strftime("%Y-%m-%d") 
d += delta 

end_str = (d-timedelta(days=1)).strftime("%Y-%m-%d") 
print(start_str+'..'+end_str) 

oder noch prägnanter dann das:

start_date=datetime(2013,9,22) 
end_date=datetime(2013,12,1) 

d = start_date 
delta = timedelta(days=10) 

interval = delta - timedelta(days=1) #the difference between the start of an interval and the last day 

while d <= end_date: 
    end = d+interval #last day of interval 
    print("{:%Y-%m-%d}...{:%Y-%m-%d}".format(d, end)) 
    d = end + timedelta(days=1) #set d to one day more then the end of interval 
Verwandte Themen