大numpy数组中时间值的区别
我有十个大小为(1000,1000)的numpy数组。每个数组里的元素都是一个浮点数,表示一天中的小时。例如,14.0代表下午2点,15.75代表下午3点45分。
我想找出这些数组之间的最大差值。结果应该是一个同样大小为(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
但是,这样计算出来的结果会把晚上11点和凌晨1点之间的差值算成22小时。我希望这个差值是2小时。我想我需要用到datetime.time,但我不知道怎么让datetime和numpy数组配合得好。
补充说明:这些时间是指某个事件发生的平均时间,并不是和特定日期相关的。因此,两个时间之间的差值可以被理解为22小时或2小时。不过,我总是希望取这两种解释中的最小值。
3 个回答
0
如果你有一个数组 diff
,里面存的是时间差,范围在0到24小时之间,你可以用下面的方法来修正那些计算错误的值:
diff[diff > 12] = 24. - diff[diff > 12]
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)
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
如果你不使用绝对值,那么你需要根据你想要被视为“第一个”的时间来调整符号。