2013-10-26 10 views
30

Ich habe eine Datei in Google-Tabellen hochgeladen (um ein öffentlich zugängliches Beispiel IPython Notebook mit Daten zu machen) Ich benutzte die Datei in seiner nativen Form könnte in einen Pandas Dataframe gelesen werden. So verwende ich jetzt den folgenden Code, um die Tabelle zu lesen, funktioniert gut, aber kommt nur als Zeichenfolge ,, und ich habe kein Glück, versuchen, es wieder in einen Datenrahmen zu bekommen (Sie können die Daten erhalten)Google Spreadsheet CSV in A Pandas Datarframe

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

die Daten endet aussehen wie: (1. Reihe Header)

',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 

die native Pandas Code, der aussieht wie in der Platte resident Datei bringt:

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

Eine "saubere" Lösung wäre hilfreich zu viele, um eine einfache Möglichkeit zum Austausch von Datasets für Pandas zu bieten! Ich habe eine Menge Alternativen ohne Erfolg ausprobiert und ich bin mir ziemlich sicher, dass ich wieder etwas Offensichtliches vermisse.

Nur ein Update Hinweis Die neue Google-Tabelle ein anderes URL-Muster Gerade dies der URL anstelle in dem obigen Beispiel hat verwenden und oder die unten Antwort und Sie sollen hier ein Beispiel in Ordnung sein:

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

siehe Lösung unterhalb von @Max Ghenis die pd.read_csv nur verwendet, keine Notwendigkeit für StringIO oder Anfragen ...

Antwort

36

Sie read_csv() auf einem StringIO Objekt verwenden können:

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

Sehr hilfreich ... müssen StringIO lernen! – dartdog

+0

Ich suchte Wochen, wie man eine Tabelle in Pandas importiert. noch nie von Anfragen oder StringIO-Bibliotheken gehört. Vielen Dank!! – moldovean

+0

Beachten Sie das neue URL-Format unten in der ursprünglichen Frage, die für die neue Google-Tabellenkalkulation Version – dartdog

26

Scheint ohne StringIO für mich zu arbeiten:

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, einschließlich der ?gid= verschiedene Blätter ermöglicht das Importieren, die gid in der URL finden.

+0

gute Punkte auch verwenden Sie P3? Habe noch keine Chance gehabt, auch nette Anfragen nachzuholen ... – dartdog

+0

Ja ich benutze Python 3. –

+1

Tolle Lösung, gerade verifiziert, viel schöner! – dartdog

1

Mein Ansatz ist ein bisschen anders. Ich habe gerade pandas.Dataframe() verwendet, aber offensichtlich benötigt, um gspread zu installieren und zu importieren. Und es hat gut funktioniert!

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

Schön..Die Schnittstelle wird immer sauberer! – dartdog

1

Ich habe folgende utils benutzen und es funktioniert bisher:

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) 

Sie den SHEET_NAME und den Schlüssel angeben müssen. Der Schlüssel ist die Zeichenfolge, die Sie von der URL im folgenden Pfad erhalten: https://docs.google.com/spreadsheets/d/{key}/edit/.

Sie können den Wert von Headern ändern, wenn Sie mehr als eine Zeile für die Spaltennamen haben, aber ich bin nicht sicher, ob es immer noch mit Multi-Headern funktioniert.

Es kann bremsen, wenn Google ihre APIs ändert.

Bitte beachten Sie auch, dass Ihre Tabelle öffentlich sein muss, jeder mit dem Link kann es lesen.

Verwandte Themen