用户
你能帮忙关注一下吗?
我需要从mysql数据库中提取数据并进行聚合。 数据库中有两个表,它们都有不同时间步的数据。 我现在需要制作一个新表(txt),其中表1的所有数据与表2数据组合。 因此,我只需要表2中的数据与表1的时间步长最相应的时间。
为了更好地理解,请参阅此处的表格示例: https://www.dropbox.com/s/mo2q0hj72ilx05n/data%20aggregation.xlsx?dl=0
我已经有一个python代码,它提取十六进制数据并生成表2。 我也有一个代码,使表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)