2014-08-29 11 views
5

Próbuję zreorganizować tabelę excela (lub csv), aby daty nie były już nagłówkami kolumn. Używam ograniczonej wiedzy o Pythonie, aby spróbować to zrobić, ale z braku wiedzy, od czego zacząć, mogę skorzystać z pomocy.Uporządkuj plik CSV, aby daty nie były nagłówkami kolumn.

Pod każdą datą jest zapis tego, co wydarzyło się tego dnia dla określonego miejsca. Wartości Null można pominąć. Niektóre komórki zawierają znak "-" i można je przekonwertować na 0. Chciałbym utworzyć kolumnę dla daty i kolumny, aby wskazać odczyt numeryczny dla danego dnia. Nazwa miejsca to nowy wiersz, jeśli był monitorowany tego dnia.

Przykład (SMH na osobę, który rozpoczął się to w ten sposób):

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 

Chciałbym to:

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. 

Istnieją setki wierszy (miejscach) i kolumny (daty) dotarły do ​​BPD (to prawda, 1772 kolumny!).

+0

Czy wiesz, jak używać modułu 'csv' lub jednego z różnych sposobów przetwarzania plików' .xls' lub skryptów Excel? Którego chcesz użyć? (Wszystkie będą działały dobrze tutaj.) – abarnert

Odpowiedz

2

To, co próbujesz zrobić, to znormalizować jako tabelę.

Sposób, w jaki to robisz, jest następujący: Dla każdego wiersza w tabeli denormalnej wstawiasz wiersze do normalnej tabeli dla każdej denormalnej kolumny.

Sposób, w jaki to robisz, zależy w szczególności od sposobu przetwarzania tabel. Na przykład, jeśli używasz modułu csv, w Pythonie 3.x, z Excel-default-dialekt pliku CSV, to będzie wyglądać następująco:

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]) 

Jeśli chcesz użyć, np , xlrd/xlwt, XlsxReader/, XlsxReader/XlsxWriter, win32com wykonywanie skryptów w programie Excel itp., Szczegóły będą różne, ale podstawowa idea będzie taka sama: iteruj po wierszach, następnie powtarzaj po kolumnach daty, generując nowy wiersz dla każdego jeden oparty na nazwie z wiersza, data z nagłówka kolumny i wartość z wiersza.

Powinieneś być w stanie dowiedzieć się, jak pominąć wartości puste, przekonwertować "--" na 0, itd. Stąd.

+0

Dziękuję! Dzięki kilku zmianom unikalnym w mojej sytuacji udało mi się go uruchomić. Jestem pewien, że te dwa komentarze poniżej zadziałałyby dobrze. Dziękuję wszystkim! –

0

Poniższy kod jest dość oczywista, nawet jeśli dopiero zaczynasz z python:

enumerate jest iterator dla indeksu, wartość iterowalny

>>> 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') 
0

Poniższy kod będzie normalizacji jako tabeli CSV opisanego formatu i wyprowadzić nowy plik csv z wierszami dla każdej pary (Miejsce, Data) z nagraniem. Zmieni także dowolne nagranie z listy "-" na 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) 
Powiązane problemy