Ежедневная запись данных в Excel с использованием DataFrames - PullRequest
0 голосов
/ 04 января 2019

Доброе утро, сейчас я работаю над проектом RPi, который каждую секунду собирает некоторые данные и переводит их в числовой показатель. Я хочу, чтобы RPi сохранил эти числовые / временные данные в файл Excel, и я также хочу, чтобы этот файл был доступен, чтобы данные были "графически-зависимыми" в зависимости от пользовательского ввода (т. Е. Пользователю нужны данные за последние 3 дня> выходных данных). график данных за последние 3 дня). Я понимаю, что это может быть разделено на две части: чтение и сохранение данных (1) и данные вытягивания и графика (2). Для этого вопроса я хотел бы сосредоточиться на (1).

Для чтения данных с датчика и сохранения их в файл Excel, который действует как база данных, я подумал об использовании DataFrame от pandas. Почему, вы можете спросить. Я основываю свой код на предыдущем коде, оставленном предшественником, и у него уже есть подобный код для чтения / записи. Однако масштаб в значительной степени отличается (~ 50 записей против ~ 38000 записей).

Я думал о записи данных как:

Образец основного текста Данные в Excel

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

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

class ShiftDataSet:

def __init__(self):
    self.effDataList = []
    self.timeDataList = []
    self.dateTimeToday = datetime.datetime.now()
    self.date = self.dateTimeToday.strftime("%y%b%d")#str
    #%y is year without century, %b is month abbv, %d is day of month

Затем эти данные (попытка) записываются в кадр данных, затем в файл Excel следующим образом:

def saveToDf(self):
    dataToSave = {self.date : self.effDataList}
    #dictionary of data to save. effDataList is the list of 1's and 0's as read by the second.

    dfToSave = pd.DataFrame(dataToSave, index=self.timeDataList)
    #create DataFrame to save as Excel, using timeDataList as index. timeDataList is a str list of the second the recording is taken

    print("Attempting to save data")

    #code to combine dfToSave with old df record
    oldDf = pd.read_excel("/home/pi/Sensor/FS Days/Shift Record Template.xlsx")
    #oldDf is the database template, structured the same way like the "Data in Excel" image above

    result = dfToSave.combine_first(oldDf)
    #combine new dataframe of new data with template database

    writer = pd.ExcelWriter("/home/pi/Sensor/FS Days/Shift Record Template.xlsx")
    result.to_excel(writer, 'Sheet 1')

    writer.save()
    print("Save Complete")

    return

Я смоделировал этот код на основе кода моего предшественника для записей меньшего масштаба. Однако, запустив этот код, я столкнулся с проблемой неправильной записи данных в файл Excel, которая в итоге выглядит следующим образом: Messed Data

Итак, мои вопросы:
1) Как я могу записать данные как взятые в секунду в надлежащий индекс «секунд»?
2) Было бы лучше записывать и сохранять данные каждую секунду или объединять их в больший список, а затем сохранять один или два раза в течение дня?
3) Является ли pandas DataFrame лучшим решением для того, что я хочу сделать, или есть лучшие методы?

Большое спасибо за помощь.

1 Ответ

0 голосов
/ 04 января 2019

1) Как вы определили индекс для dfToSave, вы должны сделать то же самое, когда вы read_excel().

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

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

...