包含时间值的大型numpy数组之间的差异

时间:2014-05-28 16:46:11

标签: python arrays numpy time python-datetime

我有十个(1000,1000)numpy数组。每个数组元素都包含一个浮点数,表示一天中的小时数。例如。 14.0 = 2pm和15.75 = 15:45 pm。

我想找到这些数组之间的最大差异。结果应该是单个(1000,1000)numpy数组,对于每个数组元素,包含十个数组之间的最大差异。目前我有以下内容,似乎工作正常:

import numpy as np

max=np.maximum.reduce([data1,data2,data3,data4,data5]) 
min=np.minimum.reduce([data1,data2,data3,data4,data5])

diff=max-min

然而,它导致了22小时的晚上11点到凌晨1点之间的差异。我需要差异为2小时。我想我需要以某种方式使用datetime.time,但我不知道如何使用numpy数组很好地使用datetime。


编辑:时间是指特定事件发生的平均时间,因此它们与特定日期无关。因此,两次的差异可以正确地解释为22小时或2小时。但是,我总是希望尽量减少这两种可能的解释。

3 个答案:

答案 0 :(得分:1)

您可以通过在循环中的中心位置周围居中一个值来取两个循环值之间的差值(12.0)。将其他值旋转相同的量以保持其相对差异。取调整值的模数乘以周期的持续时间,以使所有内容保持在界限内。您现在已经调整了时间,因此最大可能的最大距离保持在+/- 1/2周期内(+/- 12小时)。

如,

adjustment = arr1 - 12.0
arr2 = (arr2 - adjustment) % 24.0
diff = 12.0 - arr2 # or abs(12.0 - arr2) if you prefer

如果您没有使用绝对值,则需要根据您想要“首先”考虑的时间来使用该符号。

答案 1 :(得分:0)

假设你的号码是晚上11点和凌晨1点,你想找到最小距离。

1am -> 1
11pm -> 23

然后你有:

23 - 1 = 22

或者,

24 - (23 - 1) % 24 = 2

然后距离可以被认为是:

def dist(x,y):
    return min(abs(x - y), 24 - abs(x - y) % 24)

现在我们需要使用dist并将其应用于每个组合。如果我没记错的话,有一个更numpy/scipy导向的函数来执行此操作,但概念或多或少相同:

from itertools import combinations

data = [data1,data2,data3,data4,data5]
combs = combinations(data,2)
comb_list = list(combs)
dists = [dist(x,y) for x,y in comb_list]
max_dist = max(dists)

答案 2 :(得分:0)

如果时间差异的数组diff介于0到24小时之间,您可以按如下方式对错误计算的值进行更正:

diff[diff > 12] = 24. - diff[diff > 12]