计算字典中日期之间的平均时间
Calculate Average Time Between Dates in Dictionary
我正在尝试计算(排序的、不同的)日期之间的平均时间。这些日期存储在列表中,列表作为值保存在字典中(键是唯一标识符),如下所示:
my_dict = {'001':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 13)], '002':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 13)]...}
这是我为此编写的代码:
for j,k in dicts.items():
for i in range(0,len(k)):
y = timedelta(days=0)
x = k[i] - k[i-1]
y = y + x
n = len(k)
score = y/n
dicts.update({j:score})
但是,当我将获得的值与数据进行比较时,它们似乎不正确,但我不确定为什么会这样。有人可以指出我在这里做错了什么吗?
编辑:不正确的意思是平均值不正确。例如 10008 吐出 '10008': datetime.timedelta(days=33, seconds=57600)。但是该条目的日期是 11/25/2012、3/30/2013、7/92013,相隔超过 33 天。
我想你可以通过改变这一行来解决这个问题:
for i in range(0,len(k)):
到这一行:
for i in range(1,len(k)):
这是因为在您第一次遍历第二个嵌套 for 循环中的代码时,这一行 x = k[i] - k[i-1]
将导致 x = k[0] - k[-1]
,它将计算第一项与第二项之间的差异列表中的最后一项。而我认为你想要做的是计算列表中第一项和第二项之间的差异。
但是如果您按照建议更改代码,那么第一行的计算结果将是 x = k[1] - k[0]
,我认为这就是您想要的。
我看到一个潜在的问题。您从 i=0 开始,当您有 x = k[i]- k[i-1]
时,您正在从第一个元素中减去最后一个元素。这将导致负值。您可以使用 abs() 函数来解决此问题。
您可以改用 while 循环:
i = len(k) - 1
while i >= 0:
# Insert rest of code
i -= 1
首先,平均时间间隔等于第一个和最后一个差值除以间隔数。因此,如果您不需要其他任何东西,只需使用第一个和最后一个除以购买间隔数。例如,如果您有 7/10、7/20 和 7/30,则平均间隔为 10 天。如果您将 7/20 更改为 7/12,您仍然有 10 天的平均时间。
除此之外,如果您在工作时需要其他数据,这里是正确的循环:
my_dict = {'001':[datetime.date(2014, 7, 10), datetime.date(2014, 7, 20), datetime.date(2014, 7, 30)], '002':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 23)]}
import datetime
for j,k in my_dict.items():
y = datetime.timedelta(days=0) # need to move outside of loop so you can increment y
for i in range(1, len(k)): # need to skip first one to only measure intervals
x = k[i] - k[i-1]
y += x
n = len(k) - 1
score = y/n
my_dict.update({j:score})
print(my_dict)
我正在尝试计算(排序的、不同的)日期之间的平均时间。这些日期存储在列表中,列表作为值保存在字典中(键是唯一标识符),如下所示:
my_dict = {'001':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 13)], '002':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 13)]...}
这是我为此编写的代码:
for j,k in dicts.items():
for i in range(0,len(k)):
y = timedelta(days=0)
x = k[i] - k[i-1]
y = y + x
n = len(k)
score = y/n
dicts.update({j:score})
但是,当我将获得的值与数据进行比较时,它们似乎不正确,但我不确定为什么会这样。有人可以指出我在这里做错了什么吗?
编辑:不正确的意思是平均值不正确。例如 10008 吐出 '10008': datetime.timedelta(days=33, seconds=57600)。但是该条目的日期是 11/25/2012、3/30/2013、7/92013,相隔超过 33 天。
我想你可以通过改变这一行来解决这个问题:
for i in range(0,len(k)):
到这一行:
for i in range(1,len(k)):
这是因为在您第一次遍历第二个嵌套 for 循环中的代码时,这一行 x = k[i] - k[i-1]
将导致 x = k[0] - k[-1]
,它将计算第一项与第二项之间的差异列表中的最后一项。而我认为你想要做的是计算列表中第一项和第二项之间的差异。
但是如果您按照建议更改代码,那么第一行的计算结果将是 x = k[1] - k[0]
,我认为这就是您想要的。
我看到一个潜在的问题。您从 i=0 开始,当您有 x = k[i]- k[i-1]
时,您正在从第一个元素中减去最后一个元素。这将导致负值。您可以使用 abs() 函数来解决此问题。
您可以改用 while 循环:
i = len(k) - 1
while i >= 0:
# Insert rest of code
i -= 1
首先,平均时间间隔等于第一个和最后一个差值除以间隔数。因此,如果您不需要其他任何东西,只需使用第一个和最后一个除以购买间隔数。例如,如果您有 7/10、7/20 和 7/30,则平均间隔为 10 天。如果您将 7/20 更改为 7/12,您仍然有 10 天的平均时间。
除此之外,如果您在工作时需要其他数据,这里是正确的循环:
my_dict = {'001':[datetime.date(2014, 7, 10), datetime.date(2014, 7, 20), datetime.date(2014, 7, 30)], '002':[datetime.date(2014, 7, 29), datetime.date(2014, 8, 1), datetime.date(2014, 8, 5), datetime.date(2014, 8, 23)]}
import datetime
for j,k in my_dict.items():
y = datetime.timedelta(days=0) # need to move outside of loop so you can increment y
for i in range(1, len(k)): # need to skip first one to only measure intervals
x = k[i] - k[i-1]
y += x
n = len(k) - 1
score = y/n
my_dict.update({j:score})
print(my_dict)