Topic: Operazioni aritmetiche su dei valori di un dataframe Pandas  (Letto 87 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline ChIP_83

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Ho un dataframe pandas che ha questa struttura:

	data	ora	glicemia
0 19.02.2019 00:02 275
1 19.02.2019 00:07 277
2 19.02.2019 00:12 279
3 19.02.2019 00:17 283
4 19.02.2019 00:22 289
5 19.02.2019 00:27 292
6 19.02.2019 00:32 294
7 19.02.2019 00:37 296
8 19.02.2019 00:42 301
9 19.02.2019 00:47 317
10 19.02.2019 00:52 310
11 19.02.2019 00:57 300
12 19.02.2019 01:02 296
13 19.02.2019 01:07 290
14 19.02.2019 01:12 280
15 19.02.2019 01:17 270


Come potete vedere le colonne "data" e "ora" sono delle stringhe con dei caratteri che corrispondono per l'appunto a data e ora...
Vorrei trasformarle in un "numero" interpretabile e gestibile per varie operazioni.
Per farlo, sull'ora, pensavo di estrapolare le ore, moltiplicarle per 60 e sommarle al numero di minuti...
Niente di più semplice...non per me :P

Veniamo al codice...
se faccio...
dataset2['ora'][2][3:]

ottengo i minuti della cella con ID 2...

quindi, tralasciando le ore (per adesso), ho pensato che se faccio...
dataset2['ora'] = dataset2['ora'][3:]


dovrei perlomeno riempire il contenuto della colonna "ore" con solo i minuti...
Invece ottengo tanti valori nulli... anzi, ottengo valori nulli per le sole prime tre righe della tabella...

Per ora lasciamo perdere che dovrei fare il cast in int e moltiplicarlo...ecc...
Ma, come diamine posso fare per prendere dei caratteri di una stringa (che poi è una colonna dal dataframe) e farci una qualsiasi operazione, però per tutte le righe della tabella?
Mi serve un ciclo for?

Offline bebo

  • python erectus
  • ***
  • Post: 231
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Operazioni aritmetiche su dei valori di un dataframe Pandas
« Risposta #1 il: Aprile 08, 2019, 17:36 »
Ciao Chip,
se posti una richiesta di aiuto, sarebbe buona cosa aiutare chi ti aiuta fornendo un esempio del codice e del tuo input, e non un print del contenuto, perche' rende le cose piu' difficili e tediose a chi ti aiuta.

Assumendo che questo sia il tuo input:
>>> import pandas as pd
>>> df = pd.DataFrame({'data': ['19.02.2019', '19.02.2019', '19.02.2019'],
                       'ora': ['00:02', '00:07', '00:12',],
                       'glicemia': [275, 277, 279],})
>>> df
         data    ora  glicemia
0  19.02.2019  00:02       275
1  19.02.2019  00:07       277
2  19.02.2019  00:12       279


puoi aggiungere ':00' alla colonna 'ora' in modo da renderlo un oggetto facilmente interpretabile come timedelta e quindi usare qualcosa come questo: https://stackoverflow.com/questions/50308629/; qui la doc per pd.to_timedelta https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_timedelta.html#pandas.to_timedelta

E infine sommare il timedelta appena ottenuto con il datetime estrapolato da pd.to_datetime: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html#pandas.to_datetime

Ossia:
>>> pd.to_datetime(df["data"]) + pd.to_timedelta(df["ora"] + ":00")
0   2019-02-19 00:02:00
1   2019-02-19 00:07:00
2   2019-02-19 00:12:00
dtype: datetime64[ns]

e questo puoi buttarlo in una nuova colonna/series e lavorarci sopra.


Bonus track!
Puoi guadagnare ~ un 20% secco aiutando pandas spiegandogli gia' quale sara' il formato di input della data, ossia aggiungendo format="%d.%m.%Y".


>>> from timeit import timeit
>>> timeit('pd.to_datetime(df["data"]) + pd.to_timedelta(df["ora"] + ":00")', setup='import pandas as pd; df = pd.DataFrame({"data": ["19.02.2019", "19.02.2019", "19.02.2019"], "ora": ["00:02", "00:07", "00:12",], "glicemia": [275, 277, 279],})', number=5000)
12.797847712001385

>>> timeit('pd.to_datetime(df["data"], format="%d.%m.%Y") + pd.to_timedelta(df["ora"] + ":00")', setup='import pandas as pd; df = pd.DataFrame({"data": ["19.02.2019", "19.02.2019", "19.02.2019"], "ora": ["00:02", "00:07", "00:12",], "glicemia": [275, 277, 279],})', number=5000)
10.551767783999821


PS: non e' un benchmark serio perche' sono solo 3 righe di input, magari su run lunghi pandas fa qualche magia e migliora, pero' se hai un input in un formato fisso non e' una brutta idea specificarlo.

PPS: Se puoi gestire te l'input che leggi, salva insieme la data e l'ora, cosi' puoi usare una singola chiamata to_datetime gia' nell'import dei dati e specificando il format completo anche di ore e minuti.
« Ultima modifica: Aprile 09, 2019, 11:51 da bebo »

Offline ChIP_83

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Operazioni aritmetiche su dei valori di un dataframe Pandas
« Risposta #2 il: Aprile 09, 2019, 11:02 »
per ora ti ringrazio, sono un po' di fretta, stasera comunque mi leggo tutto con calma.