我有一个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'
,我怀疑我的代码是否正确。 预期结果应计算每个日期之间的差异之和,然后除以总差异,这将返回平均天数。 那么,你们中的任何人都可以提供有关如何执行此任务的建议吗?
答案 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)
将str列表转换为日期列表
dates = [datetime.date(* [int(d)for ds in d]])for ds in sortedtime]
将两个带轮班日期的列表压缩1天,并计算日期的时间差:
delta_days = [(d_t [0]-d_t [1])。d_t在列表中的天数(zip(dates [1:],dates))]
平均值将是一个简单的操作
avg_days = sum(delta_days)/ len(delta_days)
答案 2 :(得分:0)
您不能只将字符串'2016,6,22'
转换为int。在将字符串传递给int()函数之前,应删除逗号
答案 3 :(得分:0)
尝试将date(int(value))
更改为date(int(value.replace(',','')))
。