如何将给定的时间间隔划分为相等的间隔?

时间:2014-05-08 09:43:08

标签: python

给定一段时间:

a = [20,40]

我需要将它转换为相同的间隔:

a = [[20,30],[30,40]]

我试过这段代码:

v1 = a[0]; v2 = a[1]
d.append(v1)
val = abs(v1-v2)
n = int(val/2)
for i in range(n):
     v1 += n
     d.append(v1)
print d

任何人都可以建议执行此操作的代码,这将是有帮助的

3 个答案:

答案 0 :(得分:1)

我可以指出你尝试过的一些不正确的事情,而不是为你写出代码。

for i in range(n):
     v1 += n
     d.append(v1)

请记住,从你的例子中,n被设置为10.所以当你在范围(n)中说i时,你将在你的for循环中迭代10次。

如果您查看附加到d的方式,则不会将较小的列表附加到整个列表中。这将继续将所有数字附加到一个列表中。

我猜这是你目前得到的输出:[20,30,40,50,60,70,80,90,100,110,120]。

根据我的说法,再试一次: - )

答案 1 :(得分:0)

您可以通过计算间隔并使用循环在每次迭代中使用该间隔创建元组来解决第一部分。这将给出与您列出的所需结果相对应的答案。

但是,请注意,在您的示例中,上一个元组的结尾与下一个元组的开头相同。如果您不希望它们相交,那么您需要与第一个类似的逻辑,但在正确的时间执行+ 1。

这是一些代码,第一个使用for循环,第二个使用post测试循环:

def interval_divide(min, max, intervals):
   assert intervals != 0
   interval_size = round((max - min) / intervals)
   result = []
   start = min
   for start in range(min, max, interval_size):
      end = start + interval_size
      result.append([start, end])
   return result

a = [20, 40]
print("1 intervals", interval_divide(a[0], a[1], 1))
print("2 intervals", interval_divide(a[0], a[1], 2))
print("3 intervals", interval_divide(a[0], a[1], 3))
print("4 intervals", interval_divide(a[0], a[1], 4))

def interval_divide2(min, max, intervals):
   assert intervals != 0
   interval_size = round((max - min) / intervals)
   result = []
   start = min
   end = min + interval_size
   while True:
      result.append([start, end])
      start = end + 1
      end = end + interval_size
      if len(result) == intervals:
         break
   return result

print("-----")
print("1 intervals", interval_divide2(a[0], a[1], 1))
print("2 intervals", interval_divide2(a[0], a[1], 2))
print("3 intervals", interval_divide2(a[0], a[1], 3))
print("4 intervals", interval_divide2(a[0], a[1], 4))

结果如下:

$ python3 intervals.py 
1 intervals [[20, 40]]
2 intervals [[20, 30], [30, 40]]
3 intervals [[20, 27], [27, 34], [34, 41]]
4 intervals [[20, 25], [25, 30], [30, 35], [35, 40]]
-----
1 intervals [[20, 40]]
2 intervals [[20, 30], [31, 40]]
3 intervals [[20, 27], [28, 34], [35, 41]]
4 intervals [[20, 25], [26, 30], [31, 35], [36, 40]]

请注意,当我们使用三个间隔时,结束不会正确终止。这是因为我们不能在没有提醒的情况下将20除以3,因此不可能拥有相同大小的所有间隔。

我们仍然可以通过在计算间隔时删除舍入来改进我们的答案,如下所示(并且仍然保持结果为整数项):

def interval_divide(min, max, intervals):
   assert intervals != 0
   interval_size = (max - min) / intervals
   result = []
   start = min
   end = start + interval_size
   while True:
       result.append([int(start), int(end)])
       start = end
       end = end + interval_size
       if len(result) == intervals:
          break
   return result

def interval_divide2(min, max, intervals):
   assert intervals != 0
   interval_size = (max - min) / intervals
   result = []
   start = min
   end = min + interval_size
   while True:
      result.append([int(start), int(end)])
      start = end + 1
      end = end + interval_size
      if len(result) == intervals:
         break
   return result

新答案是:

1 intervals [[20, 40]]
2 intervals [[20, 30], [30, 40]]
3 intervals [[20, 26], [26, 33], [33, 40]]
4 intervals [[20, 25], [25, 30], [30, 35], [35, 40]]
-----
1 intervals [[20, 40]]
2 intervals [[20, 30], [31, 40]]
3 intervals [[20, 26], [27, 33], [34, 40]]
4 intervals [[20, 25], [26, 30], [31, 35], [36, 40]]

三个区间仍然不完全相等,但相当接近而没有使用小数位显示答案。

答案 2 :(得分:0)

使用此

select

并获取一个np.array:

import numpy as np

points = np.linspace(20, 40, num=2+1)
intervals = np.array([points[:-1], points[1:]]).transpose()
print(intervals)

当然,对于

[[20. 30.]
 [30. 40.]]

我们有

points = np.linspace(10, 40, num=6+1)
intervals = np.array([points[:-1], points[1:]]).transpose()
print(intervals)