Сумма Python и организовать данные CSV - PullRequest
0 голосов
/ 18 ноября 2018

Эта программа в значительной степени берет данные из файла данных, анализирует их (отрицательные числа -> 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)
Можно ли сделать это прямо или следует использовать списки для сохранения значений в первую очередь?
Я не могу добавить эту "строку [0]" вконец, он не печатает даты правильно, только печатает самую последнюю дату.
Файл данных можно загрузить: https://files.fm/u/yuf4bbuk
Первые 10 строк данных https://pastebin.com/9HxwcixZ
Продолжение с url / 53355207

1 Ответ

0 голосов
/ 19 ноября 2018

Вы были недалеко, но вместо sums[line[1]+line[2]+line[3]+line[4]+line[5]+line[6]+line[7]+line[8]].append(line[1]) вы должны вычислить ключ на основе первого столбца line[0], извлекая дату с подстрокой:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...