如何计算Python中具有多列的CSV文件中日期之间的平均时间?

时间:2019-04-14 10:28:03

标签: python python-3.x

我有一个csv文件,其中包含三个不同的列,即Year,Month和Day。 如果我将其打印出来,将如下所示:

csv_reader = [['2016', '6', '22'], ['2016', '10', '2'], ['2016', '11', '1'], ['2016', '11', '3'], ['2016', '11', '3'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '12', '2'], ['2016', '12', '12'], ['2016', '12', '22'], ['2016', '12', '22'], ['2017', '1', '11'], ['2017', '3', '11'], ['2017', '3', '11'], ['2017', '5', '12'], ['2017', '5', '12'], ['2017', '5', '12']]

因此,csv文件和该行都是列表。 我想从该数据集中计算每个日期之间的平均天数。我尝试使用:

from datetime import date
for value in csv_reader:
    dates = date(int(value))
    differences = [(dates[i]-dates[i-1]).days for i in range(1, len(dates))]
print(float(sum(differences))/len(differences))

但是它返回了一个错误,指出

TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

,我怀疑我的代码是否正确。 预期结果应计算每个日期之间的差异之和,然后除以总差异,这将返回平均天数。 那么,你们中的任何人都可以提供有关如何执行此任务的建议吗?

4 个答案:

答案 0 :(得分:2)

所以我们有

csv_reader = [['2016', '6', '22'], ['2016', '10', '2'], ['2016', '11', '1'], ['2016', '11', '3'], ['2016', '11', '3'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '11', '17'], ['2016', '12', '2'], ['2016', '12', '12'], ['2016', '12', '22'], ['2016', '12', '22'], ['2017', '1', '11'], ['2017', '3', '11'], ['2017', '3', '11'], ['2017', '5', '12'], ['2017', '5', '12'], ['2017', '5', '12']]

首先,要从第一条数据中获取有效日期,您需要将str转换为int,然后才调用date

date(*[int(d) for d in csv_reader[0]])

并且您需要为每个2个日期拥有一个date实例并将其减去:

date(*[int(d) for d in csv_reader[0]]) - date(*[int(d) for d in csv_reader[1]])

然后,您将获得一个timedelta对象,该对象具有.days。有时它是负数,因此您需要使用绝对值和abs

将所有那几天相加后,需要相对于元素数进行平均。

总而言之,这是您需要的循环:

total = 0
for i in range(len(csv_reader)-1):  
    total += abs((date(*[int(d) for d in csv_reader[i]]) - date(*[int(d) for d in csv_reader[i+1]])).days)

>>> total
324
>>> total / len(csv_reader)
18

答案 1 :(得分:1)

  1. 将str列表转换为日期列表

    dates = [datetime.date(* [int(d)for ds in d]])for ds in sortedtime]

  2. 将两个带轮班日期的列表压缩1天,并计算日期的时间差:

    delta_days = [(d_t [0]-d_t [1])。d_t在列表中的天数(zip(dates [1:],dates))]

  3. 平均值将是一个简单的操作

    avg_days = sum(delta_days)/ len(delta_days)

答案 2 :(得分:0)

您不能只将字符串'2016,6,22'转换为int。在将字符串传递给int()函数之前,应删除逗号

答案 3 :(得分:0)

尝试将date(int(value))更改为date(int(value.replace(',','')))