Mam dostęp do niektórych danych za pośrednictwem interfejsu API, gdzie muszę podać zakres dat dla mojego żądania, np. start = '20100101', end = '20150415'. Sądziłem, że przyspieszy to, dzieląc zakres dat na nie nakładające się interwały i wykorzystując proces wieloprocesowy w każdym interwale.Biorąc pod uwagę zakres dat, w jaki sposób możemy podzielić go na N przyległych pod-interwałów?
Mój problem polega na tym, że sposób dzielenia zakresu dat nie zapewnia konsekwentnie oczekiwanego rezultatu. Oto, co zrobiłem:
from datetime import date
begin = '20100101'
end = '201'
Załóżmy, że chcemy podzielić to na ćwiartki. Najpierw zmienić ciąg znaków w terminach:
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)
następnie podzielić ten zakres na podprzedziały:
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)
Korzystanie zaczynają się i kończą z góry otrzymujemy:
listdates = divide_date(d1, d2, 4)
print listdates # ['20100101', '20100402', '20100702', '20101001', '201'] looks correct
Ale jeśli zamiast Używam dat:
begin = '20150101'
end = '20150228'
...
listdates = divide_date(d1, d2, 4)
print listdates # ['20150101', '20150115', '20150129', '20150212', '20150226']
Brak mi dwa dni pod koniec lutego. Nie potrzebuję czasu ani strefy czasowej dla mojej aplikacji i nie mam nic przeciwko instalacji innej biblioteki.
Działa doskonale! Zwięzłe i pozbawione wszystkich moich pośrednich funkcji. Dzięki! – Scott
Właśnie zauważyłem coś, co być może chciałbyś edytować.W twojej odpowiedzi: yield (d1 + diff * i) .strftime ("% Y% m% d"), d1 jest globalna i działa z moim kodem, ale ogólnie d1 powinno się zaczynać. – Scott
@Scott: Dziękuję. Mój oryginalny kod był ze zmiennymi d1, d2, ale później zmieniono go na coś znaczącego w tym poście, ale z pozoru pominięto kilka zmian. – Abhijit