Sto accedendo ad alcuni dati tramite un'API in cui devo fornire l'intervallo di date per la mia richiesta, es. start = '20100101', fine = '20150415'. Ho pensato che avrei accelerato suddividendo l'intervallo di date in intervalli non sovrapposti e utilizzando il multiprocessing su ciascun intervallo.Dato un intervallo di date, come possiamo suddividerlo in N sotto-intervalli contigui?
Il mio problema è che il modo in cui sto suddividendo l'intervallo di date non mi dà costantemente il risultato previsto. Ecco cosa ho fatto:
from datetime import date
begin = '20100101'
end = '201'
Supponiamo di voler suddividere questo in quarti. Primo cambio la stringa in date:
def get_yyyy_mm_dd(yyyymmdd):
# given string 'yyyymmdd' return (yyyy, mm, dd)
year = yyyymmdd[0:4]
month = yyyymmdd[4:6]
day = yyyymmdd[6:]
return int(year), int(month), int(day)
y1, m1, d1 = get_yyyy_mm_dd(begin)
d1 = date(y1, m1, d1)
y2, m2, d2 = get_yyyy_mm_dd(end)
d2 = date(y2, m2, d2)
poi dividere questa gamma in sotto-intervalli:
def remove_tack(dates_list):
# given a list of dates in form YYYY-MM-DD return a list of strings in form 'YYYYMMDD'
tackless = []
for d in dates_list:
s = str(d)
tackless.append(s[0:4]+s[5:7]+s[8:])
return tackless
def divide_date(date1, date2, intervals):
dates = [date1]
for i in range(0, intervals):
dates.append(dates[i] + (date2 - date1)/intervals)
return remove_tack(dates)
Utilizzando inizio e fine dall'alto otteniamo:
listdates = divide_date(d1, d2, 4)
print listdates # ['20100101', '20100402', '20100702', '20101001', '201'] looks correct
Ma se invece Uso le date:
begin = '20150101'
end = '20150228'
...
listdates = divide_date(d1, d2, 4)
print listdates # ['20150101', '20150115', '20150129', '20150212', '20150226']
Mi mancano due giorni alla fine di febbraio. Non ho bisogno di tempo o fuso orario per la mia applicazione e non mi dispiace installare un'altra libreria.
Funziona alla grande! Conciso e senza tutte le mie funzioni intermedie. Grazie! – Scott
Hai appena notato qualcosa che forse potresti voler modificare.Nella tua risposta: yield (d1 + diff * i) .strftime ("% Y% m% d"), d1 è globale e funziona con il mio codice, ma in generale d1 dovrebbe essere avviato. – Scott
@Scott: Grazie. Il mio codice originale era con le variabili d1, d2, ma in seguito l'ho cambiato in qualcosa di significativo in questo post, ma apparentemente mancava un paio di modifiche. – Abhijit