wake-up-neo.net

Abrufen von Google Spreadsheet CSV in A Pandas Dataframe

Ich habe eine Datei in Google Spreadsheets hochgeladen (um ein öffentlich zugängliches Beispiel für IPython Notebook mit Daten zu erstellen). Ich habe die Datei in ihrer ursprünglichen Form verwendet und sie konnte in einen Pandas Dataframe eingelesen werden. Also verwende ich jetzt Der folgende Code zum Lesen der Tabelle funktioniert einwandfrei, wird jedoch nur als Zeichenfolge geliefert. Ich habe kein Glück, ihn wieder in einen Datenrahmen zu übertragen (Sie können die Daten abrufen).

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

Die Daten sehen am Ende so aus: (Überschriften der ersten Zeile)

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

Der native pandas Code, der die festplattenresidente Datei einbringt, sieht folgendermaßen aus:

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

Eine "saubere" Lösung wäre für viele hilfreich, um einen einfachen Weg zu bieten, Datensätze für Pandas zu verwenden! Ich habe eine Reihe von Alternativen ohne Erfolg ausprobiert und bin mir ziemlich sicher, dass ich vermisse wieder etwas offensichtliches.

Nur ein Update-Hinweis Die neue Google-Tabelle hat ein anderes URL-Muster. Verwenden Sie dies anstelle der URL im obigen Beispiel und/oder der folgenden Antwort, und Sie sollten in Ordnung sein. Hier ist ein Beispiel:

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

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

49
dartdog

Sie können read_csv() für ein StringIO -Objekt verwenden:

from io import BytesIO

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

In [10]: df = pd.read_csv(BytesIO(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  
50
TomAugspurger

Scheint für mich ohne das StringIO 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

Übrigens, einschließlich der ?gid= ermöglicht den Import verschiedener Blätter, finden Sie die gid in der URL.

52
Max Ghenis

Öffnen Sie das gewünschte Blatt in Ihrem Browser. Stellen Sie sicher, dass der Link für jeden sichtbar ist. Kopieren Sie die URL und fügen Sie sie ein. Du bekommst so etwas wie https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER.

sheet_url = 'https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER'

Zuerst machen wir daraus eine CSV-Export-URL wie https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER:

csv_export_url = sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')

Dann übergeben wir es an pd.read_csv , das eine URL annehmen kann.

df = pd.read_csv(csv_export_url)

Dies führt zu einer Unterbrechung, wenn Google seine API ändert (es scheint nicht dokumentiert zu sein) und möglicherweise zu nicht hilfreichen Fehlern, wenn ein Netzwerkfehler auftritt.

9
Ken Arnold

Mein Ansatz ist ein bisschen anders. Ich habe gerade pandas.Dataframe () verwendet, musste aber offensichtlich gspread installieren und 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())
8
Abhery Guha

Ich habe die folgenden Utensilien benutzt und es hat bisher funktioniert:

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 müssen den Blattnamen und den Schlüssel angeben. 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 Überschriften ändern, wenn Sie mehr als eine Zeile für die Spaltennamen haben, aber ich bin nicht sicher, ob es immer noch mit Mehrfachüberschriften funktioniert.

Es kann bremsen, wenn Google seine APIs ändert.

Denken Sie auch daran, dass Ihre Tabelle öffentlich sein muss und von jedem mit dem Link gelesen werden kann.

3

Wenn die CSV-Datei über das Laufwerk und nicht über die Tabelle freigegeben wurde, funktioniert die folgende Änderung an der URL

#Derive the id from the google drive shareable link.
#For the file at hand the link is as below
#<https://drive.google.com/open?id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69>
file_id='1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
link='https://drive.google.com/uc?export=download&id={FILE_ID}'
csv_url=link.format(FILE_ID=file_id)
#The final url would be as below:-
#csv_url='https://drive.google.com/uc?export=download&id=1-tjNjMP6w0RUV4GhJWw08ql3wYwsNU69'
df = pd.read_csv(csv_url)

Und der Datenrahmen wäre (wenn Sie nur den obigen Code ausgeführt)

    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11
3   12  13  14  15

Siehe Arbeitscode hier .

3
kaza