如何根据数组的两个日期添加列值?

时间:2017-02-01 09:27:39

标签: python python-3.x

我是编程新手。我遇到了这个要求。我有一个数组,

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

2 个答案:

答案 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