我在StackOverflow上的第一篇文章,虽然我已经读了好几年了!
我正在使用Python来清理和分析IV曲线的CSV数据转储。
我的基本问题是数据记录器给我的格式:每隔几分钟,在单个实例中,它需要大约100次测量电压(v),电流(i)和功率(p),以及转储将它们转换为CSV文件。下一个测量将附加到此。因此,我们得到的数据结构是:
Date1;0.2;0.1;0.02
Date1;0.3;0.1;0.03
Date1;0.4;0.1;0.04
Date2;0.2;0.1;0.02
Date2;0.3;0.1;0.03
Date2;0.4;0.1;0.04
Date3; etc...
此数据存储在Data.csv文件
中我写了一个名为IVCurve的课程:
class IVCurve:
def __init__(self, datetime):
self.datetime = datetime
v = []
i = []
p = []
我想创建这些类实例的列表:
count = -1
thelist = []
prev_time = 0
import csv
with open('Data.csv', 'rb') as IVdump:
IVdata = csv.reader(IVdump, delimiter=';')
for datetime, v, i, p in IVdata:
# if we're onto a new date
if prev_time != datetime:
# note the new record
prev_time=datetime
#go to the next position in thelist[]
count +=1
#create a new curve
thelist.append(IVCurve(datetime))
# in any case, put the values of v, and i into this thelist[count]
thelist[count].v.append(float(v))
thelist[count].i.append(float(i))
thelist[count].p.append(float(v)*float(i))
我遇到的问题是v和i的所有值都放在list []的每个实例中,即,我得到一个IVCurve实例列表,每个实例都有不同的日期时间,但每个都有同一组v,i和p(该集合代表所有日期的整个数据集)。
我不明白我在这里做错了什么。在我看来,每次计数都增加(每当我们找到一个新的日期)时,列表[count]应该是一个新的,唯一的记录。
示例数据(我已使用此代码)我已粘贴到此处:http://pastebin.com/Dw4dd7tu
所以问题是:我如何分离值?
非常感谢你的帮助!
答案 0 :(得分:1)
问题是你有
class IVCurve:
def __init__(self, datetime):
self.datetime = datetime
v = []
i = []
p = []
这些列表是该类的列表。因此,该类的每个实例都具有相同的列表。您希望每个实例的列表都不同,因此您应该使用__init__
方法创建它们。
class IVCurve:
def __init__(self, datetime):
self.datetime = datetime
self.v = []
self.i = []
self.p = []
答案 1 :(得分:1)
这是否能提供所需的输出?
import csv
import pprint
class IVCurve(object):
def __init__(self, datetime, v=None, i=None):
self.datetime = datetime
self.v = []
self.i = []
self.p = []
if v and i:
self.add_data(v, i)
def add_data(self, v, i):
self.v.append(float(v))
self.i.append(float(i))
self.p.append(float(v) * float(i))
def __repr__(self):
return 'IVCurve (datetime: {}, v: {}, i: {}, p: {})'.format(
self.datetime, self.v, self.i, self.p)
thelist = []
with open('Data.csv', 'rb') as ivdump:
ivdata = csv.reader(ivdump, delimiter=';')
datetime, v, i, p = next(ivdata)
thelist.append(IVCurve(datetime, v, i))
for datetime, v, i, p in ivdata:
if datetime != thelist[-1].datetime:
thelist.append(IVCurve(datetime, v, i))
else:
thelist[-1].add_data(v, i)
pprint.pprint(thelist)