Ciao a tutti, sto impazzendo con un problema che sembra stupido ma non riesco a risolvere. Sto cercando di leggere un file CSV con pandas in Python (versione 3.10), ma ottengo sempre errori strani. Il file ha colonne con date e numeri, ma pandas mi converte tutto in stringhe o mi dà errori di parsing. Ho provato con `pd.read_csv()` con vari parametri come `parse_dates`, `dtype`, ma niente sembra funzionare. Ecco un esempio del codice che sto usando:
```python
import pandas as pd
df = pd.read_csv('dati.csv', parse_dates=['data_colonna'], dtype={'valore_colonna': 'float64'})
```
L'errore che ottengo è: `ValueError: could not convert string to float: '1.234,56'`. Il problema sembra essere la virgola come separatore decimale, ma anche usando `decimal=','` non cambia nulla. Qualcuno ha avuto lo stesso problema? Come l'avete risolto? Grazie mille per l'aiuto, sto perdendo la pazienza con questo CSV maledetto!
Ciao @policarporicci71, ho capito il tuo problema e ci sono passato anch'io!
Il problema che stai riscontrando è dovuto all'utilizzo della virgola come separatore decimale nei tuoi dati numerici. Python aspetta un punto, non una virgola. Ecco come posso suggerirti di risolvere:
1. **Sostituire la virgola con il punto:** Puoi usare una funzione di pandas per sostituire la virgola con il punto prima di convertire la colonna in float:
```python
import pandas as pd
df = pd.read_csv('dati.csv', decimal=',')
df['valore_colonna'] = df['valore_colonna'].str.replace(',', '.').astype(float)
```
2. **Utilizzare un locale temporaneo:** Puoi anche impostare temporaneamente il locale di Python per usare la virgola come separatore decimale:
```python
import pandas as pd
import locale
# Salvare il locale corrente
old_locale = locale.setlocale(locale.LC_ALL, '')
# Imposta il locale temporaneo per accettare virgole
locale.setlocale(locale.LC_ALL, 'it_IT')
df = pd.read_csv('dati.csv', parse_dates=['data_colonna'], decimal=',')
df['valore_colonna'] = pd.to_numeric(df['valore_colonna'], errors='coerce')
# Ripristina il locale originale
locale.setlocale(locale.LC_ALL, old_locale)
```
Spero che questo ti aiuti a risolvere il problema! Se continui ad avere difficoltà, magari controlla anche il delimitatore del tuo file CSV. A volte l'uso di virgole o punti e virgola può causare problemi di lettura. Buona fortuna e carpe diem!
Grazie mille @stormsorrentino84, sei un mito! Ho provato subito la prima soluzione e funziona alla grande, finalmente i miei numeri non sono più trattati come stringhe. La seconda opzione con il locale non l'avevo mai vista, la tengo da parte per eventuali futuri problemi. Ora devo solo sistemare un paio di colonne con date, ma credo di cavarmela. Se mi blocco di nuovo ti chiamo! Intanto, tequila e sale sono serviti, il limone è stato spremuto a dovere.
Ehi @policarporrci71, che bella notizia che hai risolto! La carbonara della programmazione (leggasi: pandas) a volte è più complicata del previsto, ma quando finalmente funziona è una soddisfazione pazzesca. Per le colonne date, se ancora ti danno noia, prova a dare un'occhiata al parametro `dayfirst=True` se hai date tipo GG/MM/AAAA, oppure `format='%d/%m/%Y'` per forzare il parsing.
E comunque, tequila e sale dopo aver sistemato un CSV infernale? Scelta azzeccatissima, ti stimo. Io di solito celebro con un buon pecorino romano e un piatto di carbonara (ovviamente), ma ammetto che il tuo approccio ha stile. Se ti serve una mano con quelle date, fischia! 🍝👨💻