Реорганизовать CSV, поэтому даты не являются заголовками столбцов
Я пытаюсь реорганизовать таблицу excel (или csv), так что даты больше не являются заголовками столбцов. Я использую ограниченное знание python, чтобы попытаться это сделать, но из-за отсутствия знания, с чего начать, я могу использовать некоторую помощь.
Под каждой датой записывается то, что произошло в тот день для определенного места. Нулевые значения могут быть пропущены. Некоторые ячейки содержат «-» и могут быть преобразованы в 0. Я хотел бы сделать столбец для даты и столбца, чтобы обозначить числовое чтение за день. Название места – это новая строка, если в тот день ее контролировали.
Пример (smh у человека, который начал его таким образом):
- есть ли способ экспортировать изображения как zip и экспортировать данные как csv в django?
- Использование VBA для чтения строки .csv в многомерном массиве
- Экспорт CSV в XML
- Почему R поворачивает NA в одной ячейке к ряду NA?
- Прекращение анализа даты Excel
Name,7/1/2009,7/2/2009,7/3/2009,7/4/2009..... (and so on to the present) Place A,,5,3, Place B,0,,23,-- Place C,1,2,,35
Я бы хотел:
Name, Date, Reading Place A, 7/2/2009, 5 Place A, 7/3/2009, 3 Place B, 7/1/2009, 0 Place B, 7/4/2009, 0 <--- Even though this is a dash originally it can be converted to a 0 to keep the number an int.
Есть сотни строк (мест), а столбцы (даты) попадают в BPD (это правильные 1772 столбца!).
- Создание отдельных строк с использованием значения ячейки в столбце
- PHP - преобразование Unicode для CSV, например, китайские символы
- Добавление хинди-шрифта из файла excel в базу данных с использованием php
- Сохранение рабочих таблиц в CSV с формулами Excel без изменений
- Возьмите определенные строки из файла csv и поместите в файл excel с помощью python
- Преобразование файла excel в csv с помощью сообщения об ошибке python
- Выполните вывод с использованием экспортированных данных Excel / CSV, если нулевые значения найдены в 'foreach'
- экспортировать CSV в MySQL
То, что вы пытаетесь сделать, это нормализовать как таблицу.
Как вы это делаете в общем случае: для каждой строки в денормальной таблице вы вставляете строки в обычную таблицу для каждого столбца denormal.
То, как вы это делаете, в частности, зависит от того, как вы обрабатываете таблицы. Например, если вы используете модуль csv
, в Python 3.x, с CSV-файлом Excel по умолчанию, он будет выглядеть примерно так:
with open('old.csv') as oldcsv, open('new.csv', 'w') as newcsv: r, w = csv.reader(oldcsv), csv.writer(newcsv) header = next(r) w.writerow(['Name', 'Date', 'Reading']) for row in r: for colname, colval in zip(header[1:], row[1:]): w.writerow([row[0], colname, colval])
Если вы хотите использовать, например, xlrd
/ xlwt
, XlsxReader
/ XlsxWriter
, win32com
скрипты Excel и т. Д., Детали будут разными, но основная идея будет такой же: перебирать строки, а затем перебирать столбцы даты , создавая новую строку для каждого из них на основе имени из строки, даты из заголовка столбца и значения из строки.
И вы должны быть в состоянии выяснить, как пропустить нулевые значения, конвертировать "--"
в 0
и т. Д. Здесь.
Код ниже довольно понятен, даже если вы только начинаете с python
:
enumerate
– это итератор для индекса, значение iterable
>>> content = """Name,7/1/2009,7/2/2009,7/3/2009,7/4/2009 ... Place A,,5,3, ... Place B,0,,23,-- ... Place C,1,2,,35""" >>> >>> lines = [line.split(',') for line in content.split('\n')] >>> >>> for line in lines: ... if 'Name' not in line[0]: ... for count, date in enumerate(lines[0]): ... if count >= 1: ... if not line[count] or line[count] == '--': ... line[count] = 0 ... # write (line[0], date, line[count]) to a file or print it: ... print (line[0], date, line[count]) ... ('Place A', '7/1/2009', 0) ('Place A', '7/2/2009', '5') ('Place A', '7/3/2009', '3') ('Place A', '7/4/2009', 0) ('Place B', '7/1/2009', '0') ('Place B', '7/2/2009', 0) ('Place B', '7/3/2009', '23') ('Place B', '7/4/2009', 0) ('Place C', '7/1/2009', '1') ('Place C', '7/2/2009', '2') ('Place C', '7/3/2009', 0) ('Place C', '7/4/2009', '35')
Следующий код будет нормализовать в качестве таблицы csv описанного вами формата и вывести новый файл csv с строками для каждой пары (Place, Date), которая имеет запись. Он также изменит любую запись, указанную как «-», на 0.
oldlist = [] newlist = ['Name,Date,Reading'] with open('path_to_csv.csv') as oldcsv, open('newcsv.csv', 'w') as newcsv: for line in oldcsv: line = line.strip('\n') oldlist.append(line.split(',')) for (i,row) in enumerate(oldlist[1:]): for (j, column) in enumerate(row[1:]): if column != '': newrow = [] newrow.append(row[0]) #Adds place name to each newlist row. newrow.append(oldlist[0][j+1]) #Adds date to each newlist row. if column == '--': newrow.append('0') else: newrow.append(column) #Adds reading to each newlist row. newlist.append(",".join(newrow)) for line in newlist: newcsv.write("%s\n" % line)