Member 14060132 Ответов: 1

Как суммировать значения данных


Привет,
В основном в настоящее время моя программа считывает файл данных (электрическая информация), суммирует значения, а после суммирования значений меняет все отрицательные числа на 0 и сохраняет положительные числа такими, какие они есть. Программа делает это идеально. Это код, который у меня есть в настоящее время:
import csv
from datetime import timedelta
from collections import defaultdict

def convert(item): 
    try:
        return float(item)
    except ValueError:
        return 0

sums = defaultdict(list)

def daily():
    lista = []
    with open('Data.csv', 'r') as inp:
        reader = csv.reader(inp, delimiter = ';')
        headers = next(reader)
        for line in reader: 
            mittaus = max(0,sum([convert(i) for i in line[1:-2]])) 
            lista.append()
            #print(line[0],mittaus) ('#'only to check that it works ok)
daily()


Мой вопрос: как я могу сохранить данные в списки, чтобы я мог добавлять все значения в день, поэтому должно выглядеть примерно так
1.1.2016;358006
2.1.2016;39
3.1.2016;0 ...
8.1.2016;239143

И после того, как он имел их в списке (чтобы сохранить позже в новый файл данных), он должен вычислить кумулятивные значения, которые будут выглядеть следующим образом:
1.1.2016;358006
2.1.2016;358045
3.1.2016;358045...
8.1.2016;597188 

Они должны быть в новой подпрограмме

Малый пик что стоит за файлом данных: https://pastebin.com/9HxwcixZ [на самом деле он делится на";", а не на"', как в пастебине]
Файл данных: https://files.fm/u/yuf4bbuk

Что я уже пробовал:

def analysointi():
    lista = []
    reader = csv.reader(inp, delimiter = ';')
    for line in reader:
        lista.append(line)
    print(line[2])
analysointi()

Думая об этом способе, он не должен работать, так как значения уже должны быть в списке, поэтому этот способ может быть сброшен.

Я пытался искать результаты, спрашивал людей, но у меня не было никакого решения. Я просто не могу решить это сам, поэтому я был бы очень признателен, если бы кто-то мог мне помочь

Member 14060132

До сих пор не могу понять, как сохранить данные, которые в первом столбце-это дата, а во втором-значение. Я пробовал работать с датой-временем, но это не сработало.

1 Ответов

Рейтинг:
1

Richard MacCutchan

Не уверен, что понимаю суть вопроса. Но как только вы выполнили первый набор вычислений, вы можете прочитать файл данных и выполнить кумулятивные вычисления. Как только вы их получите, вы сможете записать новые данные.


Member 14060132

Идея состоит в том, чтобы
1. Прочитайте файл данных
-> В этой части он суммирует все значения, и после этого, если значение отрицательно, он возвращает 0. Если расчет положительный, он сохраняет значение по умолчанию. Я сделал это, и это прекрасно работает. Он сохраняет значения как:
2016-01-01 00:00:00 0
2016-01-01 08:00:00 356303.0
2016-01-01 16:00:00 0
и т.д.

2. проанализируйте прочитанные данные (я не могу решить, как сделать эту часть)
-> В этой части он должен суммировать значения одного дня в одну строку, поэтому он должен выглядеть следующим образом:
1.1.2016 358006
2.1.2016 39
3.1.2016 0 и т. д.

3. Последний шаг-сохранение значений 2. values в новый csv-файл
Эта часть просто сохраняет новые данные из шага 2, что довольно прямолинейно.

Richard MacCutchan

По мере чтения файла данных вам необходимо создать список входных значений. Либо список списков, либо список объектов класса. При создании списка вам нужно преобразовать текст из каждой строки в соответствующие значения: DateTime из даты и времени и integer из общего значения. Затем вы можете добавить новую информацию в итоговые значения для каждого элемента списка (или добавить новые элементы списка). Когда это будет сделано, вы просто запишите обновленную информацию.

Member 14060132

Я пытался сохранить значения в списке, но не знаю, почему это не сработало. У меня есть правильная идея в голове, но я не могу ее реализовать. Есть какие-нибудь советы, как начать редактировать код, пожалуйста?
Спасибо

Richard MacCutchan

Определите класс, который имеет атрибут даты (или datetime) и целочисленный атрибут. Не используйте типы float, если вы не пытаетесь выполнить сложные вычисления. Конструктор класса должен преобразовать первую строку в дату(время): см. 8.1. datetime — основные типы дат и времени — документация Python 2.7.15[^]. Он должен преобразовать второе число в целое число (используйте int() встроенный. Затем вы создаете объекты этого класса для каждой записи, которую Вы читаете, и добавляете их в список или диктонарий. Затем вы можете обновить значения из любых других обрабатываемых данных, выполнив поиск записи с указанной датой (и временем) и добавив ее к значению. После завершения всех обновлений вы можете записать данные в новый файл в формате .csv (или любом другом), в зависимости от требований. Не забудьте добавить ToString метод для вашего класса, чтобы облегчить запись обновленных данных.

Member 14060132

Я немного отредактировал свой код, теперь он вычисляет сумму и кумулятивные значения. Можно ли теперь сохранить эти значения в новый csv-файл? Дата должна быть в первой ячейке, а значения - во второй

def daily():    with open('MonthData1.csv', 'r') as file1:        read_file = csv.reader(file1, delimiter=';')        delheader = next(read_file)        data = defaultdict(int)        for line in read_file:            valuedata = max(0, sum([convert(i) for i in line[1:5]]))            data[line[0].split()[0]] += valuedata        for key in OrderedDict(sorted(data.items())):            print('{} {}'.format(key, data[key]))        previous_values = []        for key, value in OrderedDict(sorted(data.items())).items():            print('{} {}'.format(key, value + sum(previous_values)))            previous_values.append(value)            daily()

Richard MacCutchan

Вы записываете новые данные с помощью csv.writer: см. csv — чтение и запись CSV — файлов-документация Python 3.7.1[^].