合并2个表和汇总数据

时间:2014-09-28 08:12:58

标签: python mysql aggregate

用户

你能帮忙关注一下吗?

我需要从mysql数据库中提取数据并进行聚合。 数据库中有两个表,它们都有不同时间步的数据。 我现在需要制作一个新表(txt),其中表1的所有数据与表2数据组合。 因此,我只需要表2中的数据与表1的时间步长最相应的时间。

为了更好地理解,请参阅此处的表格示例: https://www.dropbox.com/s/mo2q0hj72ilx05n/data%20aggregation.xlsx?dl=0

我已经有一个python代码,它提取十六进制数据并生成表2。 我也有一个代码,使表1。 我现在需要结合两者。

非常感谢您的建议!

1 个答案:

答案 0 :(得分:0)

将数据表复制到Python列表后,我不得不将表2中的值拆分回独立系列。总的来说,您可以跳过将这些值合并到单表Table2中的步骤。

解决这个问题的关键是编写一个实现__getitem__的简单类,获取单个键参数并返回相应的值。例如,在常规Python dict的情况下,__getitem__返回与键完全匹配的dict条目,如果没有匹配则返回KeyError。在您的情况下,我实现了__getitem__,只返回条目中给定时间戳与条目时间戳的最小差异的条目,在此行中:

closest = min(self.data, key=lambda x: abs(x[0]-keyts))

(作为OP的练习 - 如何处理密钥恰好落在两个条目之间的情况。)如果您需要调整查找逻辑,只需更改__getitem__的实现 - 其他所有内容代码将保持不变。

以下是我的示例实现:

# t1 and t2 are lists of tab-delimited strings copy-pasted 
# from the OP's spreadsheet

TAB = '\t'
t1data = [t.split(TAB) for t in t1]
t2data = [t.split(TAB) for t in t2]

# split each parameter into individual time,value pairs
readings = {'A':[], 'B':[], 'C':[]}
for parm in "ABC":
    for trec in t2data:
        t,a,b,c = trec
        t = int(t)
        if a: readings['A'].append((t,int(a)))
        if b: readings['B'].append((t,int(b)))
        if c: readings['C'].append((t,int(c)))


# define class for retrieving value with "closest" key if
# there is not an exact match
class LookupClosest(object):

    def __init__(self, pairs):
        self.data = pairs

    def __getitem__(self, key):
        # implement logic here to find closest matching item in series

        # TODO - what if key is exactly between two different values?
        closest = min(self.data, key=lambda x: abs(x[0]-key))
        return closest[1]


# convert each data series to LookupClosest
for key in "ABC":
    readings[key] = LookupClosest(readings[key])

# extract and display data
for vals in t1data:
    t = int(vals[0])
    gps = vals[1]
    a = readings['A'][t]
    b = readings['B'][t]
    c = readings['C'][t]
    rec = t,gps,a,b,c
    print rec

打印:(我修改了Table1数据,以便您可以区分一条记录到下一条记录):

( 1, 'x01', 1, 10, 44)
(10, 'x10', 2, 11, 47)
(21, 'x21', 4, 12, 45)
(30, 'x30', 3, 12, 44)
(41, 'x41', 4, 12, 47)
(52, 'x52', 2, 10, 48)