python – 以有效的方式根据其他数组减少numpy数组中的数据

我想就python中数组减少数据的问题向你提供帮助,我是python的新手,但我有一些编程经验.

问题包括以下内容我有一个n个元素的数组S来自传感器的测量结果,并且旁边有四个其他数组,表示测量的年份,月份,日期和时间(y_lna,m_lna ,d_lna和h_lna),我还有另外一个m个相等元素的数组T伴随着4个数组(y,m,d,h),我想创建一个与S相同大小的向量,其中T的值匹配S小时,天,月和年的那些.

这些数据的组织方式使它们具有从0年到0年的值,顺序如下:

Data   h d m  y
d1    00 1 1 2003
d2    03 1 1 2003
...
dn    10 5 8 2009

我已经创建了一个允许这样做的功能,但我不确定它是否以正确的方式完成,它还需要花费大量时间来执行它所执行的迭代次数,有没有办法更有效地完成它?我不知道如何处理纳米值

def reduce_data(h, d, m, y, h_lna, d_lna, m_lna, y_lna, data):
    year = np.linspace(2003, 2016, 14, True)
    month = np.linspace(1, 12, 12, True)
    new_data = []
    for a in year:
        ind1 = [i for i in range(len(y)) if y[i] == a]
        ind1_l = [i for i in range(len(y_lna)) if y_lna[i] == a]
        for b in range(len(month)):
            ind2 = [i for i in ind1 if m[i] == b + 1]
            ind2_l = [i for i in ind1_l if m_lna[i] == b + 1]
            for c in range(len(ind2)):  # days
                ind3 = [i for i in ind2 if d[i] == c]
                ind3_l = [i for i in ind2_l if d_lna[i] == c]
                for dd in range(len(ind3)):
                    for e in range(len(ind3_l)):
                        if h[ind3[dd]] == h_lna[ind3_l[e]]:
                            new_data.append(data[ind3[dd]])
    return new_data

感谢您的合作

编辑:我添加了我正在使用的数据,传感器的值不是真正的,我用随机数据替换它们,但时间值是真实的(仅一年). data1具有传感器S的数据,其时间变量是用于减少的参考值,data2具有传感器T的数据及其时间变量,最后result是具有预期结果的数据.

数据1

        S       h_lna   d_lna   m_lna   y_lna
    0   0        8       6        2     2003
    1   2        9       6        2     2003
    2   4       10       6        2     2003
    3   6       11       6        2     2003
    4   8       12       6        2     2003
    5   10      13       6        2     2003
    6   12      14       6        2     2003
    7   14      15       6        2     2003
    8   16      16       6        2     2003
    9   18      17       6        2     2003
   10   20      18       6        2     2003

数据2

    T   h   d   m   y
0   864 0   6   2   2003
1   865 1   6   2   2003
2   866 2   6   2   2003
3   867 3   6   2   2003
4   868 4   6   2   2003
5   869 5   6   2   2003
6   870 6   6   2   2003
7   871 7   6   2   2003
8   872 8   6   2   2003
9   873 9   6   2   2003
10  874 10  6   2   2003
11  875 11  6   2   2003
12  876 12  6   2   2003
13  877 13  6   2   2003
14  878 14  6   2   2003
15  879 15  6   2   2003
16  880 16  6   2   2003
17  881 17  6   2   2003
18  882 18  6   2   2003
19  883 19  6   2   2003
20  884 20  6   2   2003
21  885 21  6   2   2003
22  886 22  6   2   2003
23  887 23  6   2   2003
24  888 0   7   2   2003
25  889 1   7   2   2003
26  890 2   7   2   2003
27  891 3   7   2   2003
28  892 4   7   2   2003
29  893 5   7   2   2003
30  894 6   7   2   2003
31  895 7   7   2   2003
32  896 8   7   2   2003
33  897 9   7   2   2003
34  898 10  7   2   2003

结果

    result  h_lna   d_lna   m_lna   y_lna
0   872        8      6      2      2003
1   873        9      6      2      2003
2   874       10      6      2      2003
3   875       11      6      2      2003
4   876       12      6      2      2003
5   877       13      6      2      2003
6   878       14      6      2      2003
7   879       15      6      2      2003
8   880       16      6      2      2003
9   881       17      6      2      2003
10  882       18      6      2      2003

解决方法:

从“加入”的角度来看待这一点.首先,获取数据2并将其编入索引以进行有效查找:

d2i = d2.set_index(['y', 'm', 'd', 'h'])

现在d2i有一个MultiIndex(y,m,d,h)和一个Series(T).

然后使用join():

d1.join(d2i, ['y_lna', 'm_lna', 'd_lna', 'h_lna'])

如果您要使用它们,也可以考虑在两个数据集上构建正确的DatetimeIndex.使用pd.to_datetime():

year = np.datetime64(d2.y - 1970, 'Y') # Unix epoch = 1970-01-01
month = np.timedelta64(d2.m - 1, 'M') # January adds 0
day = np.timedelta64(d2.d - 1, 'D')
hour = np.timedelta64(d2.h, 'h')
index = pd.to_datetime(year + month + day + hour)
d2s = pd.Series(d2['T'], index)

现在,您将拥有一个系列T,其中包含整个日期和时间信息作为其索引.如果使用两个DataFrame执行此操作,则使用join / merge / index / asof操作突然可以轻松使用它们.

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...