2017-12-03 189 views
1

我想找到几个输入值在相应的数组中匹配的索引。作为示例,考虑一个时间序列,数据集包含多个数组:yearsmonthsdayshours。数组的值按时间顺序填充。由于数据集是在几年的时间范围内收集的,所以years数组将被排序,但其余数组将不会被排序(因为hours中的值将仅从每年每月每天0-24进行排序)。即使该数据集是在数年的时间范围内收集的,数据集也不一定是连续的 - 意味着观测值之间的天数或小时数(或由连续指数确定的值)可以是大于1(但并非总是)。如何查找与具有已定义层次结构的相应数组中最接近的一组值相对应的索引?

import numpy as np 

years = np.array([2017, 2017, 2018, 2018, 2018, 2018]) 
months = np.array([12, 12, 1, 1, 1, 2]) # 1-12 months in the year 
days = np.array([31, 31, 1, 2, 18, 1]) # 28 (or 29), 30, or 31 days per month 
hours = np.array([4, 2, 17, 12, 3, 15]) # 0-23 hours per day 

def get_matching_time_index(yy, mm, dd, hh): 
    """ This function returns an array of indices at which all values are matched in their corresponding arrays. """ 
    res, = np.where((years == yy) & (months == mm) & (days == dd) & (hours == hh)) 
    return res 

idx_one = get_matching_time_index(2018, 1, 1, 17) 
# >> [2] 

idx_two = get_matching_time_index(2018, 2, 2, 0) 
# >> [] 

idx_one = [2]由于years的第二索引是2018,的months的第二索引是1,的days的第二索引是1,并且hours的第二索引是17。由于idx_two空了,我想扩大我的搜索范围,找到对应于下一个最近时间的索引。由于每个数组的最后一个索引最接近输入日期时间参数的相应值,因此我希望返回这些数组的最后一个索引(在这种情况下为5)。

有人可能会认为不可能在多个数组中找到最接近的一组值。但在这种情况下,小时优先于日期,优先于月份等。(因为从输入时间离开3小时的观察时间比从输入时间离开3天的观察时间更近)。

我发现了很多漂亮的解决方案,可以在一个阵列上工作via this post on StackOverflow,但不适用于适用于多个阵列的情况。此外,发布的最有效的解决方案假定数组是排序的,而在我的示例中唯一排序的数组是年数。

我想我可以重复该操作中建议的操作,对每个多重数组重复相同的过程 - 这样,我可以找到每个数组通用的索引。然后,可以计算在公共索引处找到的输入时间参数和时间参数的差异。从较小单位的阵列(在这种情况下为hours)开始,可以选择对应于最小差异的指数。但是,我觉得有一种更简单的方法可能更有效。

如何才能更好地处理此问题,以便通过多个数组找到与最接近的数据点分组对应的索引?这是多维数组变得方便吗?

编辑: 第二个想法是,可以将所有时间参数转换为经过时间。然后,可以找到与经过的小时内离得最近的观察值相对应的指数。无论如何,我仍然对解决这个问题的各种方式感到好奇。

回答

1

您的编辑包含可能是个好主意。

快速的安全方式来实现即:

In [93]: dates=np.vectorize(datetime.datetime)(years,months,days,hours) 

In [94]: np.abs(datetime.datetime(2018, 1, 1, 0)-dates).argmin() 
Out[94]: 2 
相关问题