【问题标题】:Combining multiple timeseries data to one 2d numpy array将多个时间序列数据组合到一个二维 numpy 数组
【发布时间】:2012-07-26 00:59:55
【问题描述】:

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

此数据位于一个包含大约 50 万条记录的表中的一个 sqlite 数据库中。我打算使用 javascript 图表库 dygraph 显示这些数据,我已经通过按传感器名称执行 sql 查询并保存到 csv 来分别为每个传感器生成timeseries 图表。我希望有一个图表来显示所有数据点,并用一条线代表每个传感器。

我创建了一个名为“minutes_array”的字符串类型的 numpy 2d 数组,第一列为 unix 时间戳,四舍五入到最接近的分钟,涵盖从传感器时间序列开始到结束的每一分钟,并用三个空列填充来自可用的 3 个传感器中的每一个的数据。

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]

然后我希望修改 minutes_array 中对于该掩码为 true 的记录,并将 sensor_data 值放入 minutes_array 中时间戳之后的第一列。从我的尝试来看,当应用掩码时似乎无法更改原始的“minutes_array”,有没有办法在 numpy 中实现此结果,而不使用 for 循环和单独匹配时间戳?

已解决

根据@eumiro 下面的回答,我使用了solution from the 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")

【问题讨论】:

    标签: python numpy time-series pandas


    【解决方案1】:

    半百万不是你用 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
    

    【讨论】:

    • 当您说“填写字典”时,我不确定您建议采用哪种结构?以 sensor_name 作为键或时间戳?
    • @seumas - 构建一个字典,即data[timestamp][sensor]data[sensor][timestamp]。两者都可以轻松转换为 pandas.DataFrame。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多