繁体   English   中英

以特定格式将“字典词典”写入.csv文件

[英]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 )和日期列表进行此操作。

这就是我想出的。 它可能很难看,但是可以工作:

编辑 :添加sorteddtDict.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM