Eseguire il riempimento delle date L’argomento è risolto

Il software per la BI di Microsoft, leader nel mercato
Rispondi
Avatar utente

calcioscacchi
Messaggi: 61 | Topic creati
Iscritto il: lun 31 mag 2021, 12:21
Ringraziato: 4 volte

Eseguire il riempimento delle date

Messaggio da calcioscacchi »

Ciao a tutti,
Prendiamo un dataset che descrive eventi: inizio, fine, e varie informazioni su quell'evento.
sto sbattendo la testa su un problema legato alla base dati che ho sotto mano. Molte righe del mio dataset (ve ne condivido qualcuna opportunamente camuffata da dati sensibili) hanno la data di inizio minore della data di fine. A livello riepilogativo, questo è un problema, perchè quando vado a prendere i minuti ad esempio del 4 gennaio, questi sono ben maggiodi dei canonici 1440 minuti/giorno.

Mi occorre riempire il vuoto, andando a creare delle righe che vanno dalla mezzanotte fino alla fine dell'evento. In alcuni casi, devo creare più righe.
Ho preparato un excel che spero sia abbastanza esaustivo, con alcune righe esemplificative.

Vi sono 4 categorie:

A--> DataInizio=DataFine, queste vanno bene
B--> DataFine = DataInizio+1, in questo caso occorre creare una riga in più, chiudere la prima alle 23:59:59 di Data Inizio e aprire la seconda alle 00:00:00 di DataFine.
C--> DataFine = DataInizio+N. In questo caso oltre che a creare una riga in più come per la categoria B, devo anche riempire il vuoto creando righe per ogni giorno che manca, aprendo alle 00:00:00 e chiudendo alle 23:59:59. Esempio più esaustivo nell'excel.
D--> DataInizio>DataFine. In questo caso non serve fare nulla, le identifico e le filtro direttamente da PowerQuery.


Quando creo una riga, tutte le altre informazioni rimangono uguali.

Avete dei suggerimenti da darmi? Grazie.
Allegati
Esempio_date_PBI.xlsx
(20.69 KiB) Scaricato 11 volte


Avatar utente

Andrea90
Messaggi: 2193 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 666 volte
Contatta:

Eseguire il riempimento delle date

Messaggio da Andrea90 »

calcioscacchi,

Utilizzi la sintassi {[data_inizio]..[data_fine]} per creare una lista "innestata" di date, poi la espandi e vai ad eseguire un check se la data che ottieni è uguale a quella iniziale allora avrai come orario di partenza quello che ti riporta il sistema, e come valore di fine giornata sempre 23:59, se la data che ottieni nella lista è uguale a quella di fine allora avrai come orario di inizio 00:00 e come orario di fine quella del sistema, in tutti gli altri casi l'orario di inizio sarà sempre 00 e quello di fine 23:59.

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
calcioscacchi
Messaggi: 61 | Topic creati
Iscritto il: lun 31 mag 2021, 12:21
Ringraziato: 4 volte

Eseguire il riempimento delle date

Messaggio da calcioscacchi »

Ho capito la strategia, provo e ti faccio sapere. Secondo me ci sono delle cose nel tuo ragionamento che non funzionano, ma provo e ti riporto caso per caso ;)
Grazie intanto per la dritta.
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 325 volte
Contatta:

Eseguire il riempimento delle date

Messaggio da Enrico Galli »

calcioscacchi ha scritto: ven 31 mar 2023, 9:46 Secondo me ci sono delle cose nel tuo ragionamento che non funzionano
Andrea90 ha scritto: gio 30 mar 2023, 17:58 se la data che ottieni è uguale a quella iniziale allora avrai come orario di partenza quello che ti riporta il sistema, e come valore di fine giornata sempre 23:59, se la data che ottieni nella lista è uguale a quella di fine allora avrai come orario di inizio 00:00 e come orario di fine quella del sistema, in tutti gli altri casi l'orario di inizio sarà sempre 00 e quello di fine 23:59
Il ragionamento di Andrea90 funziona benissimo, ha solo "omesso" la casistica ovvia (se la data coincide sia con quella di inizio sia con quella di fine, replicare le due colonne originali). Presuppone che tu crei altre due colonne "event_datetime_2", "event_end_datetime_2" che sono quelle su cui poi calcolerai il delta
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
calcioscacchi
Messaggi: 61 | Topic creati
Iscritto il: lun 31 mag 2021, 12:21
Ringraziato: 4 volte

Eseguire il riempimento delle date

Messaggio da calcioscacchi »

Eccomi, devo ricredermi, il tuo suggerimento era azzeccato su tutti i fronti.
Ora il risultato è quello sperato. Mi riservo un po' di tempo per giocarci, ma se avrò dei problemi, aprirò una discussione dedicata.
Enrico Galli Certo, quel passaggio non l'aveva esplicitato ma era scontato, infatti ho ricreato una colonna Data Inizio e una Data Fine con i nuovi criteri.

Grazie.

Per i posteri:

Creazione lista, colonna poi da espandere su nuove righe e modificare in tipo Data

Codice: Seleziona tutto

= Table.AddColumn(#"Modificato tipo2", "DateList", each {Number.From([event_start_date])..Number.From([event_end_date])})
Colonna Data_Inizio: se DateList combacia con event_start_date, prendere il dato dalla colonna che contiene il formato datetime (io ne avevo due, una tipo date per confronto e una di tipo datetime che contiene l'informazione che ci serve), altrimenti siamo in un giorno diverso e deve iniziare da 00:00:00. Convertire la colonna in formato datetime

Codice: Seleziona tutto

= Table.AddColumn(#"Modificato tipo", "Data_Inizio", each if [DateList]=[event_start_date] then [event_datetime] else [DateList])
Colonna Data_Fine: se DateList è uguale alla data di fine evento, allora siamo arrivati alla fine dell'evento e utilizziamo la corrispondente datetime (come sopra). Altrimenti, attraverso la funzione DateTime.From, creare la chiusura alle 23:59:59. Convertire poi in datetime.

Codice: Seleziona tutto

= Table.AddColumn(#"Modificato tipo3", "Data_Fine", each if [DateList]=[event_end_date] then [event_end_datetime] else DateTime.From(#datetime(Date.Year([DateList]),Date.Month([DateList]),Date.Day([DateList]),23,59,59)))
Ultima modifica di calcioscacchi il ven 31 mar 2023, 11:05, modificato 1 volta in totale.
Rispondi