假設data
總是排序,沒有重複的元素(你可以做data = sorted(set(data))
如果不是這樣),你可以做這樣的事情:
import datetime
data = ['2016-1-01', '2016-1-08', '2016-1-15', '2016-1-22', '2016-1-29', '2016-02-05', '2016-02-12', '2016-02-19', '2016-02-26']
query = [(datetime.date(2016, 1, 19), 3, 1, 5), (datetime.date(2016, 1, 20), 10, 4, 5), (datetime.date(2016, 1, 30), 1, 4, 6)]
# Convert data to datetime objects
data = [datetime.datetime.strptime(d, '%Y-%m-%d').date() for d in data]
output = []
query_it = iter(query)
next_date = data[0]
next_nums = (0, 0, 0)
# Iterate through date ranges
for d_start, d_end in zip(data, data[1:] + [datetime.date.max]):
# If the next interesting date is in range
if next_date < d_end:
nums = next_nums
next_nums = (0, 0, 0)
for q in query_it:
q_date, q_nums = q[0], q[1:]
if q_date < d_start:
# Ignore dates before the first date in data
continue
elif q_date < d_end:
# Add query numbers to count if in range
nums = tuple(n1 + n2 for n1, n2 in zip(nums, q_nums))
else:
# When out of range save numbers for next
next_date = q_date
next_nums = q_nums
break
else:
# Default to zero when no query dates in range
nums = (0, 0, 0)
# Add result to output
output.append((d_start,) + nums)
for out in output:
print(out)
輸出:
(datetime.date(2016, 1, 1), 0, 0, 0)
(datetime.date(2016, 1, 8), 0, 0, 0)
(datetime.date(2016, 1, 15), 13, 5, 10)
(datetime.date(2016, 1, 22), 0, 0, 0)
(datetime.date(2016, 1, 29), 1, 4, 6)
(datetime.date(2016, 2, 5), 0, 0, 0)
(datetime.date(2016, 2, 12), 0, 0, 0)
(datetime.date(2016, 2, 19), 0, 0, 0)
(datetime.date(2016, 2, 26), 0, 0, 0)
查詢結果在哪裏?在一個文件中,一個字符串,一個列表? – jdehesa
我已經存儲瞭如下查詢結果: [(datetime.date(2016,1,19),3,1,5), (datetime.date(2016 ,1,20),10,4,5), (datetime.date(2016,1,30),1,4,6)] – nas