在一年的时间里,我有timeseries
来自三个不同传感器的数据,传感器大约每 3 分钟产生一个数据点,传感器不同步,因此它们在相对于彼此的不同时间产生一个数据点输出。
该数据位于一个包含大约 50 万条记录的表中的 sqlite 数据库中。我打算使用 javascript 图表库 dygraph 显示这些数据,我已经timeseries
通过按传感器名称执行 sql 查询并保存到 csv 来分别为每个传感器生成图表。我希望有一个图表来显示所有数据点,一条线代表每个传感器。
我创建了一个名为'minutes_array'的numpy 2d类型字符串数组,第一列作为unix时间戳,四舍五入到最接近的分钟,覆盖从传感器时间序列开始到结束的每一分钟,三个空列填充每个数据可用的 3 个传感器中的一个。
分钟数组
[['1316275620' '' '' '']
['1316275680' '' '' '']
['1316275740' '' '' '']
...,
['1343206920' '' '' '']
['1343206980' '' '' '']
['1343207040' '' '' '']]
然后传感器时间序列数据也被四舍五入到最接近的分钟,我使用 numpy.in1d 并从上面的“minutes_array”和“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]
然后,我希望修改 minutes_array 中对于该掩码为 true 的记录,并将 sensor_data 值放入 minutes_array 中时间戳之后的第一列。从我的尝试来看,当应用掩码时,似乎不可能改变原始的“minutes_array”,有没有办法在 numpy 中实现这个结果,而不使用 for 循环和单独匹配时间戳?
解决了
根据@eumiro 下面的回答,我使用了Pandas Docs 中的解决方案和上面描述的 '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")