[Risolto] [Python/Pandas] Filtrare contenuto di DatetimeIndex

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

[Risolto] [Python/Pandas] Filtrare contenuto di DatetimeIndex

Messaggio da vaeVictis »

Ricevo dati da un sensore ogni 15 minuti, dalle 22:00 di domenica fino alle 21:45 di venerdì.
Il sensore, invece, è spento dalle 21:45:01 di venerdì fino alle 21:59:59 di domenica.


Può capitare che il sensore salti la scrittura di un dato.
Quindi posso avere due tipi di dato mancante:
1) "eventuali" dati mancanti, nell'intervallo temporale in cui il sensore è acceso
2) dati "sicuramente" mancanti, nell'intervallo temporale in cui il sensore è spento.

Il sensore scrive i suoi dati su un file csv, che io leggo con:

Codice: Seleziona tutto

>>> import pandas as pd
>>> my_data = pd.read_csv("data.csv", header = None, comment = '#', index_col = 5, parse_dates = True)

Facendo per esempio riferimento ai dati ricevuti a cavallo di venerdì/domenica della scorsa settimana, per la colonna degli index ottengo:

Codice: Seleziona tutto

>>> my_data.index
DatetimeIndex(['2021-05-21 19:00:00', '2021-05-21 19:15:00',
               '2021-05-21 19:30:00', '2021-05-21 19:45:00',
               '2021-05-21 20:00:00', '2021-05-21 20:30:00',
               '2021-05-21 20:45:00', '2021-05-21 21:00:00',
               '2021-05-21 21:15:00', '2021-05-21 21:30:00',
               '2021-05-21 21:45:00', '2021-05-23 22:00:00',
               '2021-05-23 22:15:00', '2021-05-23 22:30:00',
               '2021-05-23 22:45:00', '2021-05-23 23:00:00',
               '2021-05-23 23:15:00', '2021-05-23 23:30:00',
               '2021-05-23 23:45:00', '2021-05-24 00:00:00',
               '2021-05-24 00:15:00', '2021-05-24 00:30:00',
               '2021-05-24 00:45:00', '2021-05-24 01:00:00',
               '2021-05-24 01:15:00'],
              dtype='datetime64[ns]', name=5, freq=None)
Tenendo in considerazione che 2021-05-21 era venerdì e 2021-05-23 era domenica, si vede che
  • 2021-05-21 20:15:00 è l'unico dato mancante del primo tipo
  • c'è ovviamente un "buco" di dati mancanti tra 2021-05-21 22:00:00 e 2021-05-23 21:45:00, che sono dovuti al fatto che il sensore è spento in quell'intervallo di tempo.
Ora, con pandas per vedere quali date mancano si può fare:

Codice: Seleziona tutto

missing = pd.date_range(start='2021-05-21 19:00', end = '2021-05-24 01:15', freq = '15min').difference(my_data.index)
e ottengo:

Codice: Seleziona tutto

>>> missing
DatetimeIndex(['2021-05-21 20:15:00', '2021-05-21 22:00:00',
               '2021-05-21 22:15:00', '2021-05-21 22:30:00',
               '2021-05-21 22:45:00', '2021-05-21 23:00:00',
               '2021-05-21 23:15:00', '2021-05-21 23:30:00',
               '2021-05-21 23:45:00', '2021-05-22 00:00:00',
               ...
               '2021-05-23 19:30:00', '2021-05-23 19:45:00',
               '2021-05-23 20:00:00', '2021-05-23 20:15:00',
               '2021-05-23 20:30:00', '2021-05-23 20:45:00',
               '2021-05-23 21:00:00', '2021-05-23 21:15:00',
               '2021-05-23 21:30:00', '2021-05-23 21:45:00'],
              dtype='datetime64[ns]', length=193, freq=None)
Ora, di questi "missing" a me interessano solo i dati mancanti del primo tipo.
Posso eliminare quello che non mi serve in questo modo:

Codice: Seleziona tutto

>>> [ item for item in missing if item.weekday() in range(0, 4) or ( item.weekday() == 4 and item.time() <= datetime.time(21, 45) ) or ( item.weekday() == 6 and item.time() >= datetime.time(22, 00) )  ]
[Timestamp('2021-05-21 20:15:00')]
Mi chiedo se esista un modo (con Pandas) di eliminare i dati mancanti del secondo tipo, direttamente quando calcolo il DatetimeIndex "missing".
Esiste?

Spero di essere stato chiaro, se così non fosse chiedete pure.

Grazie in anticipo :ciao:
Ultima modifica di vaeVictis il sabato 29 maggio 2021, 8:09, modificato 1 volta in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python/Pandas] Distinguere due tipi di indici mancanti

Messaggio da vaeVictis »

MI rispondo da solo, dopo una ricerca matta e forsennata.

Si può fare, basta usare una mask

Codice: Seleziona tutto

>>> import datetime
>>> missing_weekday = missing.weekday
>>> missing_time = missing.time
>>> missing_mask = (missing_weekday < 4) |  ( (missing_weekday == 4) & (missing_time <= datetime.time(21, 45)) ) | ( (missing_weekday == 6) & (missing_time >= datetime.time(22, 00)) )
>>> missing[missing_mask]
DatetimeIndex(['2021-05-21 20:15:00'], dtype='datetime64[ns]', freq=None)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Risolto] [Python/Pandas] Filtrare contenuto di DatetimeIndex

Messaggio da nuzzopippo »

Tecniche interessanti, rispondo giusto per averle più a portata di mano.

Purtroppo, pandas (come molto altro) esula dagli utilizzi "pythonici" da me fatti, di norma non ho tal genere di problematiche, non di meno son casi da tener presenti ;)
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 11 ospiti