我想就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操作突然可以轻松使用它们.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。