Consiguiendo el CSV de la hoja de cálculo de Google en un dataframe de Pandas

Subí un archivo a las hojas de cálculo de Google (para hacer un ejemplo de IPython Notebook de acceso público, con datos). Estaba usando el archivo en su forma nativa y se podía leer en un Marco de datos de Pandas. Así que ahora uso el siguiente código para leer la hoja de cálculo, funciona bien pero solo aparece como una cadena, y no tengo suerte intentando volver a incluirla en un dataframe (puede obtener los datos)

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

Los datos terminan pareciéndose a: (1ª fila de encabezados)

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

El código de pandas nativo que trae el archivo residente del disco se ve así:

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

¡Una solución “limpia” sería útil para muchos para proporcionar una manera fácil de compartir conjuntos de datos para el uso de Pandas! Intenté un montón de alternativas sin éxito y estoy bastante seguro de que me estoy perdiendo algo obvio otra vez.

Solo una nota de actualización La nueva hoja de cálculo de Google tiene un patrón de URL diferente. Solo use esto en lugar de la URL en el ejemplo anterior y / o la respuesta a continuación, y debería estar bien. Este es un ejemplo:

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

vea la solución a continuación de @Max Ghenis, que acaba de usar pd.read_csv, sin necesidad de StringIO o solicitudes …

Puedes usar read_csv() en un objeto StringIO :

 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 

Parece funcionar para mí sin el 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 

Por cierto, incluyendo el ?gid= permite importar diferentes hojas, encuentra el gid en la URL.

Mi enfoque es un poco diferente. Acabo de usar pandas.Dataframe () pero obviamente necesito instalar e importar gspread. ¡Y funcionó bien!

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

Abra la hoja específica que desea en su navegador. Asegúrate de que al menos sea visible para cualquiera que tenga el enlace. Copia y pega la URL. Obtendrá algo como https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/edit#gid=NUMBER .

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

Primero, convertimos eso en una URL de exportación CSV, como https://docs.google.com/spreadsheets/d/BLAHBLAHBLAH/export?format=csv&gid=NUMBER :

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

Luego lo pasamos a pd.read_csv , que puede tomar una URL.

 df = pd.read_csv(csv_export_url) 

Esto se romperá si Google cambia su API (parece no documentado), y puede dar errores inútiles si se produce un fallo de red.

Si el archivo csv se compartió a través de la unidad y no a través de una hoja de cálculo, el siguiente cambio en la URL funcionaría

 #Derive the id from the google drive shareable link. #For the file at hand the link is as below # 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) 

Y el dataframe sería (si acaba de ejecutar el código anterior)

  abcd 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 

Ver código de trabajo aquí .

He estado usando los siguientes utiles y funcionó hasta ahora:

 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) 

Debe especificar el sheet_name y la clave. La clave es la cadena que obtiene de la url en la siguiente ruta: https://docs.google.com/spreadsheets/d/{key}/edit/ .

Puede cambiar el valor de los encabezados si tiene más de una fila para los nombres de columna, pero no estoy seguro de si todavía funciona con varios encabezados.

Puede frenar si Google cambiará sus API.

También tenga en cuenta que su hoja de cálculo debe ser pública, todos los que tengan el enlace pueden leerla.