2013-10-26 8 views
30

Przesłałem plik do arkuszy kalkulacyjnych Google (aby udostępnić publicznie przykładowy notatnik IPython z danymi) Użyłem tego pliku w jego natywnej formie i można go odczytać w ramce danych Pandas. Teraz używam następującego kodu do odczytu arkusza kalkulacyjnego, działa dobrze, ale po prostu przychodzi jako ciąg ,, i nie mam żadnego szczęścia, próbując go z powrotem wprowadzić w ramkę danych (można uzyskać dane)Uzyskiwanie pliku CSV Arkusza Google w Pandas Dataframe

import requests 
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv') 
data = r.content 

dane kończy się patrząc jak: (nagłówki wierszy 1st)

',City,region,Res_Comm,mkt_type,Quradate,National_exp,Alabama_exp,Sales_exp,Inventory_exp,Price_exp,Credit_exp\n0,Dothan,South_Central-Montgomery-Auburn-Wiregrass-Dothan,Residential,Rural,1/15/2010,2,2,3,2,3,3\n10,Foley,South_Mobile-Baldwin,Residential,Suburban_Urban,1/15/2010,4,4,4,4,4,3\n12,Birmingham,North_Central-Birmingham-Tuscaloosa-Anniston,Commercial,Suburban_Urban,1/15/2010,2,2,3,2,2,3\n 

natywny kod pandy, która przynosi w pliku rezydenta dysk wygląda następująco:

df = pd.io.parsers.read_csv('/home/tom/Dropbox/Projects/annonallanswerswithmaster1012013.csv',index_col=0,parse_dates=['Quradate']) 

roztwór A „czysty” byłoby pomocne do wiele, aby zapewnić łatwy sposób udostępniania zbiorów danych do użytku Pand! Wypróbowałem kilka alternatyw bez powodzenia i jestem pewien, że znowu brakuje mi czegoś oczywistego.

Tylko Aktualizacja uwagę Nowy arkusz kalkulacyjny Google ma inny wzorzec URL Wystarczy użyć tego zamiast adresu URL w powyższym przykładzie i lub poniżej odpowiedź i powinno być w porządku to jest przykład:

https://docs.google.com/spreadsheets/d/177_dFZ0i-duGxLiyg6tnwNDKruAYE-_Dd8vAQziipJQ/export?format=csv&id 

patrz poniżej rozwiązanie z @Max Ghenis który właśnie użył pd.read_csv, nie ma potrzeby StringIO lub wnioski ...

Odpowiedz

36

można użyć read_csv() na StringIO obiektu:

from StringIO import StringIO # got moved to io in python3. 

import requests 
r = requests.get('https://docs.google.com/spreadsheet/ccc?key=0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc&output=csv') 
data = r.content 

In [10]: df = pd.read_csv(StringIO(data), index_col=0,parse_dates=['Quradate']) 

In [11]: df.head() 
Out[11]: 
      City           region  Res_Comm \ 
0  Dothan South_Central-Montgomery-Auburn-Wiregrass-Dothan Residential 
10  Foley        South_Mobile-Baldwin Residential 
12 Birmingham  North_Central-Birmingham-Tuscaloosa-Anniston Commercial 
38  Brent  North_Central-Birmingham-Tuscaloosa-Anniston Residential 
44  Athens     North_Huntsville-Decatur-Florence Residential 

      mkt_type   Quradate National_exp Alabama_exp Sales_exp \ 
0   Rural 2010-01-15 00:00:00    2   2   3 
10 Suburban_Urban 2010-01-15 00:00:00    4   4   4 
12 Suburban_Urban 2010-01-15 00:00:00    2   2   3 
38   Rural 2010-01-15 00:00:00    3   3   3 
44 Suburban_Urban 2010-01-15 00:00:00    4   5   4 

    Inventory_exp Price_exp Credit_exp 
0    2   3   3 
10    4   4   3 
12    2   2   3 
38    3   3   2 
44    4   4   4 
+1

Bardzo pomocna ... będę musiała nauczyć się StringIO! – dartdog

+0

Szukałem tygodni, jak zaimportować arkusz kalkulacyjny do pandy. nigdy nie słyszałem o żądaniach lub bibliotekach StringIO. Dziękuję Ci!! – moldovean

+0

Zwróć uwagę na nowy format adresu URL na dole oryginalnego pytania, który jest wymagany w przypadku nowej wersji arkusza kalkulacyjnego Google – dartdog

26

wydaje się działać dla mnie bez StringIO:

test = pd.read_csv('https://docs.google.com/spreadsheets/d/' + 
        '0Ak1ecr7i0wotdGJmTURJRnZLYlV3M2daNTRubTdwTXc' + 
        '/export?gid=0&format=csv', 
        # Set first column as rownames in data frame 
        index_col=0, 
        # Parse column values to datetime 
        parse_dates=['Quradate'] 
       ) 
test.head(5) # Same result as @TomAugspurger 

BTW, w tym ?gid= umożliwia importowanie różnych arkuszy, znajdź GID w adresie URL.

+0

dobrych punktów także używasz P3? Nie miałem okazji, by ponownie sprawdzić również ładne, nie wymagające prośby ... – dartdog

+0

Tak, używam Pythona 3. –

+1

Świetne rozwiązanie, właśnie to zweryfikowałem, o wiele ładniej! – dartdog

1

Moje podejście jest nieco inne. Po prostu użyłem pandas.Dataframe(), ale oczywiście potrzebowałem zainstalować i zaimportować gspread. I działało dobrze!

gsheet = gs.open("Name") 
Sheet_name ="today" 
wsheet = gsheet.worksheet(Sheet_name) 
dataframe = pd.DataFrame(wsheet.get_all_records()) 
+0

Nice..The interfejs jest coraz czystszy! – dartdog

1

Używam następujące utils i pracował do tej pory:

def load_from_gspreadsheet(sheet_name, key): 
    url = 'https://docs.google.com/spreadsheets/d/{key}/gviz/tq?tqx=out:csv&sheet={sheet_name}&headers=1'.format(
     key=key, sheet_name=sheet_name.replace(' ', '%20')) 

    log.info('Loading google spreadsheet from {}'.format(url)) 

    df = pd.read_csv(url) 
    return df.drop([col for col in df.columns if col.startswith('Unnamed')], axis=1) 

Musisz określić SHEET_NAME i klucz. Kluczem jest ciąg znaków otrzymany z adresu URL w następującej ścieżce: https://docs.google.com/spreadsheets/d/{key}/edit/.

Możesz zmienić wartość nagłówków, jeśli dla nazw kolumn masz więcej niż jeden wiersz, ale nie jestem pewien, czy nadal działa z wieloma nagłówkami.

Może to zaszkodzić, jeśli Google zmieni swoje interfejsy API.

Pamiętaj też, że Twój arkusz kalkulacyjny musi być publiczny, każdy z linkiem może go przeczytać.

Powiązane problemy