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

问题描述 投票:3回答:4

我有一个包含三个不同列的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'

我怀疑我的代码是否真的正确无误。预期结果应计算每个日期之间的差异总和,然后除以总差异,这将返回平均天数。那么,您是否可以就如何执行此任务提出建议?

python python-3.x
4个回答
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. 将str列表转换为日期列表 date = [datetime.date(* [d(在d中为d)的int(d)])
  2. 压缩两个日期列表,其中班次为1天,并计算时间天数: delta_days = [(d_t [0] - d_t [1])。列表中的d_t天数(zip(日期[1:],日期))]
  3. 平均值将是一个简单的操作 avg_days = sum(delta_days)/ len(delta_days)

0
投票

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


0
投票

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.