我有一个包含三个不同列的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'
我怀疑我的代码是否真的正确无误。预期结果应计算每个日期之间的差异总和,然后除以总差异,这将返回平均天数。那么,您是否可以就如何执行此任务提出建议?
所以我们有
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
你不能只是将这个字符串'2016,6,22'
转换为int。在将字符串传递给int()函数之前,应删除逗号
尝试将date(int(value))
改为date(int(value.replace(',','')))
。