[英]writing “dictionary of dictionaries” to .csv file in a particular format
我正在从多个.csv文件中生成字典,它看起来像这样(示例):
dtDict = {'AV-IM-1-13991730': {'6/1/2014 0:10': '0.96',
'6/1/2014 0:15': '0.92',
'6/1/2014 0:20': '0.97'},
'AV-IM-1-13991731': {'6/1/2014 0:10': '1.96',
'6/1/2014 0:15': '1.92',
'6/1/2014 0:20': '1.97'},
'AV-IM-1-13991732': {'6/1/2014 0:10': '2.96',
'6/1/2014 0:15': '2.92',
'6/1/2014 0:20': '2.97'},
'AV-IM-1-13991733': {'6/1/2014 0:10': '3.96',
'6/1/2014 0:15': '3.96',
'6/1/2014 0:20': '3.97'}}
我想将其保存为以下格式的.csv文件:
timestamp,AV-IM-1-13991730,AV-IM-1-13991731,AV-IM-1-13991732,AV-IM-1-13991733
6/1/2014 0:10,0.96,1.96,2.96,3.96
6/1/2014 0:15,0.92,1.92,2.92,3.96
6/1/2014 0:20,0.97,1.97,2.97,3.97
到目前为止,我拥有的这段代码(与该目标有关):
header = '''# file...... Recorder file
# date...... Thu Mar 12 14:35:32 2015
# user...... Sri
# host...... (null)
# group..... None
# property.. AVA Measurements
# limit.....
# interval..'''
testpower = open("custpower.csv",'w')
testpower.writelines([header,'\n','# timestamp\n'])
...
for key, value in dtDict.iteritems():
#Still trying to figure out how to write to custpower.csv
我尝试做类似的事情:
for key, value in dtDict.iteritems():
testpower.writelines([key,',',','.join(value),'\n'])
但是它并没有完全按照我的意愿去做。
如果您可以使用pandas
。
import pandas as pd
data = {'AV-IM-1-13991730': {'6/1/2014 0:10': '0.96',
'6/1/2014 0:15': '0.92',
'6/1/2014 0:20': '0.97'},
'AV-IM-1-13991731': {'6/1/2014 0:10': '1.96',
'6/1/2014 0:15': '1.92',
'6/1/2014 0:20': '1.97'},
'AV-IM-1-13991732': {'6/1/2014 0:10': '2.96',
'6/1/2014 0:15': '2.92',
'6/1/2014 0:20': '2.97'},
'AV-IM-1-13991733': {'6/1/2014 0:10': '3.96',
'6/1/2014 0:15': '3.96',
'6/1/2014 0:20': '3.97'}}
df = pd.DataFrame(data)
df.to_csv(PATH_TO_OUTPUT_FILE)
df
变成一个看起来像
AV-IM-1-13991730 AV-IM-1-13991731 AV-IM-1-13991732 AV-IM-1-13991733
6/1/2014 0:10 0.96 1.96 2.96 3.96
6/1/2014 0:15 0.92 1.92 2.92 3.96
6/1/2014 0:20 0.97 1.97 2.97 3.97
您生成的csv看起来像
,AV-IM-1-13991730,AV-IM-1-13991731,AV-IM-1-13991732,AV-IM-1-13991733
6/1/2014 0:10,0.96,1.96,2.96,3.96
6/1/2014 0:15,0.92,1.92,2.92,3.96
6/1/2014 0:20,0.97,1.97,2.97,3.97
熊猫也很好,因为您可以这样做:
df.convert_objects(convert_numeric=True).plot()
# the converts change "0.97" -> 0.97 so it's plottable
要得到:
您可以像这样将数据重新组织到一个新的列表结构字典中。 请记住,您将在打印之前读入整个文件(它必须获得第一个时间戳的最后一个值)。 因此,如果您的投入很大,可能会很慢。 同样,字典也不以任何特定顺序保留其键,因此,如果顺序很重要,则可能需要将键保存在单独的列表中。
ts = dtDict.keys()
print "timestamp," + ",".join(ts)
reformatted = {}
for k in ts:
sub_dict = dtDict[k]
for timestamp in sub_dict.keys():
value = sub_dict[timestamp]
if not reformatted.has_key(timestamp):
reformatted[timestamp] = []
reformatted[timestamp].append(value)
for rec in reformatted.keys():
print rec + " " + ",".join(reformatted[rec])
当然,如果时间戳记集始终保持一致,则可以做一些更简单的事情:
datasets = dtDict.keys()
timestamps = dtDict[datasets[0]].keys()
for ts in timestamps:
values = []
for ds in datasets:
values.append(dtDict[ds][ts])
print ts + " " + "".join(values)
同样,它将以任意顺序显示,除非您提前设置顺序。 因此,您无需提前从字典本身设置时间戳,而只需提前阅读它们即可。
字典词典在浏览AV-IM-1-139917XX
代码和日期时比较麻烦。 由于调用dtDict.iteritems()
类的命令时无法保证顺序,因此需要将键作为列表进行排序。 我使用ID( AV-IM-1-139917XX
)和日期列表进行此操作。
这就是我想出的。 它可能很难看,但是可以工作:
( 编辑 :添加sorted
到dtDict.keys()
)
dates = []
av_im = sorted(dtDict.keys())
for k, v in dtDict.iteritems():
dates = v.keys() # this returns a list of date keys
dates = sorted(list(set(dates))) # remove duplicates and sort
print dates # ['6/1/2014 0:10', '6/1/2014 0:15', '6/1/2014 0:20']
print av_im # ['AV-IM-1-13991730', 'AV-IM-1-13991731', 'AV-IM-1-13991732', 'AV-IM-1-13991733']
这为我提供了在字典中导航所需的值列表。 所以现在我可以做:
csv_list = []
for date in dates:
s = str(date)
for code in av_im:
s = s +','+str(dtDict[code][date])
csv_list.append(s)
print csv_list # ['6/1/2014 0:10,0.96,1.96,2.96,3.96', '6/1/2014 0:15,0.92,1.92,2.92,3.96', '6/1/2014 0:20,0.97,1.97,2.97,3.97']
现在我们可以写到csv了:
import csv
with open('mycsv.csv', 'w') as f:
w = csv.writer(f, delimiter = ',')
w.writerows([s.split(',') for s in csv_list])
我们得到的csv如下所示:
6/1/2014 0:10,0.96,1.96,2.96,3.96
6/1/2014 0:15,0.92,1.92,2.92,3.96
6/1/2014 0:20,0.97,1.97,2.97,3.97
根据需要自定义以包含标题...
需要考虑的一些事情:在示例中,您给出的日期/时间很容易排序。 如果你的真实数据集跨越多天或采用12小时制,或其他任何东西比你显示什么更复杂的,那么你应该的日期/时间的唯一列表转换为列表datetime
对象和排序的。
尝试这个:
outStr = ''
for key, value in dtDict.iteritems():
outStr += str(key) + ','
outStr = outStr[:-1]
print outStr
valueStr1 = '6/1/2014 0:10'
valueStr2 = '6/1/2014 0:15'
valueStr3 = '6/1/2014 0:20'
for keys, values in dtDict.iteritems():
for key, value in values.iteritems():
if key == '6/1/2014 0:10':
valueStr1 += str(value)
if key == '6/1/2014 0:15':
valueStr2 += str(value)
if key == '6/1/2014 0:20':
valueStr3 += str(value)
print valueStr1
print valueStr2
print valueStr3
当然,您无需print
写入文件。
编辑:考虑到下面的混乱
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.