我是编程新手。我遇到了这个要求。我有一个数组,
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']
我的查询结果如下:
date a b c
2016-01-19 3 1 5
2016-01-20 10 4 5
2016-01-30 1 4 6
我正在尝试生成每周报告数据。
在此示例中,日期'2016-01-19'和'2016-01-20'来自上面的查询位于数据数组'2016-01-15'和'2016-01-22'之间,因此a,b &安培; c将被添加。
最终输出应该是这样的:
2016-1-01 0 0 0
2016-1-08 0 0 0
2016-1-15 13 5 10
2016-1-22 0 0 0
2016-1-29 1 4 6
2016-2-05 0 0 0
2016-2-12 0 0 0
2016-2-19 0 0 0
2016-2-26 0 0 0
答案 0 :(得分:2)
假设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)
答案 1 :(得分:1)
这假定data
是有序的,否则使用sorted(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_result = [
(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 string dates to datetime.date
date_data = [ datetime.datetime.strptime(date, '%Y-%m-%d').date()
for date in data ]
res = []
# zip the dates together in pairs
for start, end in zip(date_data, date_data[1:]):
tally_a = tally_b = tally_c = 0
for date, a, b, c in query_result:
# if date is in between add values
if start <= date <= end:
tally_a += a
tally_b += b
tally_c += c
res.append( (start, tally_a, tally_b, tally_c) )
# Output
for d, a, b, c in res:
print(d, a, b, c, sep = '\t')
2016-01-01 0 0 0
2016-01-08 0 0 0
2016-01-15 13 5 10
2016-01-22 0 0 0
2016-01-29 1 4 6
2016-02-05 0 0 0
2016-02-12 0 0 0
2016-02-19 0 0 0