【问题标题】:Calculate Average Time Between Dates in Dictionary计算字典中日期之间的平均时间
【发布时间】:2021-10-19 19:11:44
【问题描述】:

我正在尝试计算(排序的、不同的)日期之间的平均时间。这些日期存储在列表中,这些列表作为值保存在字典中(键是唯一标识符),如下所示:

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 天。

【问题讨论】:

  • wdym seem to be incorrect?
  • 索引到k[i-1] 将在i==0 时环绕到klast 元素,这真的是您想要的吗?如果不迭代 range(1,len(k)),不要忘记相应地调整 n(n 个元素列表表示 n-1 个增量)
  • 请展示一些示例输出并解释其中的不正确之处。
  • 例如 10008 吐出 '10008':datetime.timedelta(days=33, seconds=57600)。但该条目的日期是 11/25/2012、3/30/2013、7/92013,相隔超过 33 天。

标签: python date dictionary datetime time


【解决方案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)

【讨论】:

    【解决方案2】:

    我看到了一个潜在的问题。你从 i=0 开始,当你有 x = k[i]- k[i-1] 时,你从第一个元素中减去最后一个元素。这将导致负值。你可以使用 abs() 函数来解决这个问题。

    您可以改用 while 循环:

    i = len(k) - 1
    while i >= 0:
        # Insert rest of code
        i -= 1
    

    【讨论】:

      【解决方案3】:

      我认为你可以通过改变这一行来解决这个问题:

      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],我认为这就是您想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-16
        • 2019-07-12
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        相关资源
        最近更新 更多