【问题标题】:Python sum and organize csv dataPython求和并组织csv数据
【发布时间】:2019-04-21 04:27:49
【问题描述】:

这个程序几乎从数据文件中获取数据,分析它(负数 -> 0)并将所有内容保存到一个新文件中。

import csv
from collections import defaultdict

def convert(item): 
    try:
        item = float(item)
        if item < 0:
            return 0
        else:
            return item
    except ValueError:
        return item

sums = defaultdict(list)

with open('Data.csv', 'r') as inp, open('output1.csv', 'w', newline = '') as outp:
    reader = csv.reader(inp, delimiter = ';')
    writer = csv.writer(outp, delimiter = ';', dialect = 'excel')
    headers = next(reader)
    for line in reader: 
        line = [convert(i) for i in line]
        sums[line[1]+line[2]+line[3]+line[4]+line[5]+line[6]+line[7]+line[8]
             ].append(line[1])
        writer.writerow(line)

for k,v in sums.items():
    print(line[0], '{} total: {}'.format(k,sum(v)))

我想将每天的所有值添加到一行,所以它会是这样的:

1.1.2016 369416  
2.1.2016 4825

...等等。到一个新的(或现有的输出)文件。 (所以在分析和修改负数后将数字相加为0)
可以直接完成,还是应该先使用列表来保存值?
我不能在最后添加“line[0]”,它不能正确打印日期,只打印最后一个日期。
数据文件可下载:https://files.fm/u/yuf4bbuk
前10行数据https://pastebin.com/9HxwcixZ
续 url/53355207

【问题讨论】:

标签: python excel python-3.x csv


【解决方案1】:

您已经不远了,但您应该根据第一列 line[0] 通过提取带有子字符串的日期来计算一个键,而不是 sums[line[1]+line[2]+line[3]+line[4]+line[5]+line[6]+line[7]+line[8]].append(line[1])

with open('solarData.csv', 'r') as inp, open('output.csv', 'w', newline = '') as outp:
    reader = csv.reader(inp, delimiter = ';')
    headers = next(reader)
    for line in reader: 
        line = [convert(i) for i in line]
        sums[line[0][:10]].append(line[1]+line[2]+line[3]+line[4]+line[5]+line[6]+line[7]+line[8])

    writer = csv.writer(outp, delimiter = ';', dialect = 'excel')
    for k, v in sums.items():
        print('{} : {}'.format(k, sum(v)))
        writer.writerow([k, sum(v)])

给予

2016-01-01;369416.0
2016-01-02;4825.0
2016-01-03;0.0

您还可以预先计算总和而不是添加到列表中,还可以打印累积值:

sums = defaultdict(lambda:0)

with open('solarData.csv', 'r') as inp, open('output2.csv', 'w', newline = '') as outp:
    reader = csv.reader(inp, delimiter = ';')
    headers = next(reader)
    for line in reader: 
        line = [convert(i) for i in line]
        sums[line[0][:10]] += line[1]+line[2]+line[3]+line[4]+line[5]+line[6]+line[7]+line[8]

    writer = csv.writer(outp, delimiter = ';', dialect = 'excel')
    cumulative = 0
    for k, v in sums.items():
        cumulative += v
        print('{} : {}\t{}'.format(k, v, cumulative))
        writer.writerow([k, v, cumulative])

【讨论】:

  • 谢谢,这就是我想要的!在保持每日值(在每日数据之后立即打印累积)的情况下,添加累积数据是否也很​​困难?我试图解决它,所以我只是将现有总和的数字相加,但无法管理它。 1.1.2016;358006 2.1.2016;358045 ... 8.1.2016;597188 9.1.2016;679353
  • 是的,当然,您可以使用我在编辑中指定的累积变量。
  • 谢谢,如果我可以问,再编辑一次,是否可以先打印所有天的值,然后从头开始打印累积值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2012-02-27
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多