将多个时间序列数据合并成一个二维numpy数组

3

我有一年内来自三个不同传感器的时间序列数据,每隔大约3分钟传感器会产生一个数据点,这些传感器没有同步,因此相对于彼此它们会在不同的时间产生数据点输出。

这些数据存储在一个sqlite数据库中的一个表中,该表包含大约50万条记录。我打算使用javascript图表库dygraph来显示这些数据,我已经通过按传感器名称进行sql查询并保存为csv文件来分别为每个传感器生成了时间序列图表。我希望有一个图表可以显示所有数据点,并用一条线表示每个传感器。

我创建了一个名为“minutes_array”的numpy 2d数组,其类型为字符串,第一列是四舍五入到最近一分钟的unix时间戳,覆盖从传感器时间序列开始到结束的每一分钟,并留有三个空列以填充每个传感器的数据(如果有的话)。

minutes_array

[['1316275620' '' '' '']
 ['1316275680' '' '' '']
 ['1316275740' '' '' '']
 ..., 
 ['1343206920' '' '' '']
 ['1343206980' '' '' '']
 ['1343207040' '' '' '']]

传感器的时间序列数据也会被四舍五入到最近的分钟,我使用numpy.in1d从以上的“minutes_array”中提取时间戳,并从“sensor_data”数组中创建一个与该传感器相关的记录的掩码。 sensor_data
[['1316275680' '215.2']
 ['1316275860' '227.0']
 ['1316276280' '212.2']
 ..., 
 ['1343206380' '187.7']
 ['1343206620' '189.4']
 ['1343206980' '192.9']]

 mask = np.in1d(minutes_array[:,0], sensor_data[:,0])

 [False  True False ..., False  True False]

我希望能够修改在mask中为真的minutes_array记录,并将sensor_data值放入紧随时间戳后的第一列。从我的尝试来看,似乎无法在应用掩码时修改原始的“minutes_array”,有没有一种方法可以在numpy中实现这个结果,而不使用for循环并逐个匹配时间戳?

已解决

基于下面@eumiro的答案,我使用了Pandas文档中的解决方案和上面描述的“sensor_data”numpy数组。

sensors = ['s1','s2','s3']    
sensor_results = {}
for sensor in sensors:
    sensor_data = get_array(db_cursor, sensor)
    sensor_results[sensor] = pd.Series(sensor_data[:,1], \
                                   index=sensor_data[:,0])
df = pd.DataFrame(buoy_results)
df.to_csv("output.csv")
1个回答

4

50万个数据对于Python字典来说并不是难以处理的数字。

从数据库中读取所有传感器的数据,填充一个字典,然后构建一个numpy数组,或者更好的方法是将其转换为pandas.DataFrame

import pandas as pd

inp1 = [(1316275620,   1), (1316275680,   2)]
inp2 = [(1316275620,  10), (1316275740,  20)]
inp3 = [(1316275680, 100), (1316275740, 200)]

inps = [('s1', inp1), ('s2', inp2), ('s3', inp3)]

data = {}
for name, inp in inps:
    d = data.setdefault(name, {})
    for timestamp, value in inp:
        d[timestamp] = value
df = pd.DataFrame.from_dict(data)

df现在是:

            s1  s2   s3
1316275620   1  10  NaN
1316275680   2 NaN  100
1316275740 NaN  20  200

当你说“填充字典”时,我不确定你建议什么样的结构?将传感器名称作为键还是时间戳? - seumas
@seumas - 构建一个字典的字典,即 data[timestamp][sensor]data[sensor][timestamp]。两者都可以轻松转换为 pandas.DataFrame。 - eumiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接